设计模式之——中介者设计模式

来源:互联网 发布:weego我去旅行 知乎 编辑:程序博客网 时间:2024/05/17 06:17

定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。

说白了就是:一系列对象的交互交给中介者处理,各对象之间完全不依赖。

实际生活中,QQ群,聊天室,游戏大厅,短信平台 都属于这种模式 - 每个用户都不直接依赖其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。

这里有篇文章是说中介者、代理、外观模式之间的比较的,这三个模式还是比较容易混的:http://blog.csdn.net/xdd19910505/article/details/24793099

我们就来模拟一下斗地主结算金豆的功能:为了简化操作,设定只要农民有一个赢了金豆,他的队友也会获得同样的豆子,中国好队友啊,如果一个农民输了就都输,好残酷的游戏

先抽象出玩家

package com.zndroid.dm.MediatorModel.APlayer;import com.zndroid.dm.MediatorModel.AMediator.Mediator;/** * Created by luzhenyu on 2017/9/19. */public abstract class Player {    private int beans;    public int getBeans() {        return beans;    }    public void setBeans(int beans) {        this.beans = beans;    }    public abstract void sweepBeans(Mediator mediator, int count);}
package com.zndroid.dm.MediatorModel.APlayer;/** * Created by luzhenyu on 2017/9/19. */public abstract class ALandowner extends Player {}
package com.zndroid.dm.MediatorModel.APlayer;/** * Created by luzhenyu on 2017/9/19. */public abstract class AFarmer extends Player {}
抽象中介者,并实例化

package com.zndroid.dm.MediatorModel.AMediator;import com.zndroid.dm.MediatorModel.APlayer.AFarmer;import com.zndroid.dm.MediatorModel.APlayer.ALandowner;/** * Created by luzhenyu on 2017/9/19. */public abstract class Mediator {    protected AFarmer framer;    protected AFarmer framer1;    protected ALandowner landowner;    public Mediator(AFarmer framer, AFarmer framer1, ALandowner landowner) {        this.framer = framer;        this.framer1 = framer1;        this.landowner = landowner;    }    public abstract void farmerWin(int count);    public abstract void landownerWin(int count);}
package com.zndroid.dm.MediatorModel.AMediator.impl;import com.zndroid.dm.MediatorModel.AMediator.Mediator;import com.zndroid.dm.MediatorModel.APlayer.AFarmer;import com.zndroid.dm.MediatorModel.APlayer.ALandowner;/** * Created by luzhenyu on 2017/9/19. */public class QQMediator extends Mediator {    public QQMediator(AFarmer framer, AFarmer framer1, ALandowner landowner) {        super(framer, framer1, landowner);    }    @Override    public void farmerWin(int count) {        framer.setBeans(framer.getBeans() + count);        framer1.setBeans(framer1.getBeans() + count);        landowner.setBeans(landowner.getBeans() - 2 * count);        log();        checkWinner();    }    @Override    public void landownerWin(int count) {        framer.setBeans(framer.getBeans() - count);        framer1.setBeans(framer1.getBeans() - count);        landowner.setBeans(landowner.getBeans() + 2 * count);        log();        checkWinner();    }    private void checkWinner() {        if (landowner.getBeans() <= 0) {            landowner.setBeans(0);            System.out.println("农民赢!!!");        } else if (framer.getBeans() <= 0 || framer1.getBeans() <= 0) {            framer.setBeans(0);            framer1.setBeans(0);            System.out.println("地主赢!!!");        }    }    private void log() {        System.out.println("----------------------------------------");        System.out.println("frame          frame1          landowner");        System.out.print(" " + framer.getBeans() + "              ");        System.out.print(framer1.getBeans() + "               ");        System.out.print(landowner.getBeans() + "  ");        System.out.println("");        System.out.println("----------------------------------------");    }}
package com.zndroid.dm.MediatorModel.APlayer.impl;import com.zndroid.dm.MediatorModel.AMediator.Mediator;import com.zndroid.dm.MediatorModel.APlayer.ALandowner;/** * Created by luzhenyu on 2017/9/19. */public class Landowner extends ALandowner {    @Override    public void sweepBeans(Mediator mediator, int count) {        mediator.landownerWin(count);    }}
package com.zndroid.dm.MediatorModel.APlayer.impl;import com.zndroid.dm.MediatorModel.AMediator.Mediator;import com.zndroid.dm.MediatorModel.APlayer.AFarmer;/** * Created by luzhenyu on 2017/9/19. */public class Framer extends AFarmer {    @Override    public void sweepBeans(Mediator mediator, int count) {        mediator.farmerWin(count);    }}
具体使用如下

/**         * 中介者模式         * 定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。         * 优点:         * 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。         * 缺点:         * 中介者会庞大,变得复杂难以维护;中介者一旦挂了,全部瘫痪;新增加一个处理对象时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。         * 我们遇到:一组定义良好的对象,现在要进行复杂的相互通信;想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以考虑使用这种模式         *         * 具体应用:         * MVC架构,QQ群,聊天室,游戏大厅,短信平台 - 每个用户都不直接依赖其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。         * */        //斗地主咯~ (三人斗地主 假如每个人都有50颗金豆)        //模拟系统自动结算金豆数(为了简化操作,设定只要农民有一个赢了金豆,他的队友也会获得同样的豆子,中国好队友啊,如果一个农民输了就都输,好残酷的游戏)        //音乐响起:        // ....        // --不要炸的痛        // --输了耍赖        // --明牌你比我快        // --网络人生 戏里戏外        // --霎那间全想开~~~        AFarmer farmer = new Framer();        AFarmer farmer1 = new Framer();        ALandowner landowner = new Landowner();        farmer.setBeans(50);        farmer1.setBeans(50);        landowner.setBeans(50);        QQMediator mediator = new QQMediator(farmer, farmer1, landowner);        //Round 1        farmer.sweepBeans(mediator, 5);        //Round 2        farmer1.sweepBeans(mediator, 10);        //Round 3        landowner.sweepBeans(mediator, 5);        //Round 4        farmer.sweepBeans(mediator, 15);        log("----------------我是分割线-----------------");

运行结果:

[ ======================================== ]
----------------------------------------
frame          frame1          landowner
 55              55               40  
----------------------------------------
----------------------------------------
frame          frame1          landowner
 65              65               20  
----------------------------------------
----------------------------------------
frame          frame1          landowner
 60              60               30  
----------------------------------------
----------------------------------------
frame          frame1          landowner
 75              75               0  
----------------------------------------
农民赢!!!
[ ----------------我是分割线----------------- ]
[ ======================================== ]




【欢迎上码】

【微信公众号搜索 h2o2s2】


原创粉丝点击