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

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

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

实际生活中,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】


猜你喜欢

转载自blog.csdn.net/luzhenyuxfcy/article/details/78031937