中介者模式--万能和事佬(行为模式04)

什么是中介者模式
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必明显作用,从而使他们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他对象之间的作用。保证这些作用可以独立变化。

中介者模式适用场景
对象之间交互操作过多且每个操作依赖彼此,防止修改一个对象行为影响全局。

中介者模式的角色
Mediator:抽象中介者角色
ConcreteNediator:具体中介者角色
Colleague:抽象同事类角色
ConcreteColleague:具体同时类 角色

中介者模式用例
电脑主板处理了很多事情,我们插上CD播放视频,cpu处理数据,显卡显示图像数据,声卡播放声音数据等

UML类图
这里写图片描述

抽象主板类AbstractMediator:

public abstract class AbstractMediator {
    abstract void changed(AbstractColleague c);
}

具体主板类:

public class MainBoard extends AbstractMediator {

    private CD cd;
    private CPU cpu;
    private Display display;
    private Sound sound;
    @Override
    void changed(AbstractColleague c) {
        //cd读取数据
        if(c == cd){
            handleCD((CD)c);
        }
        //cpu处理数据
        else if(c == cpu){
            handleCPU((CPU)c);
        }
    }

    //cpu读取数据后与其他设备交互
    private void handleCPU(CPU cpu){
        sound.soundPlay(cpu.getDataSound());
        display.display(cpu.getDataVideo());
    }

    //cd读取后交互cpu
    private void handleCD(CD cd){
        cpu.decodeData(cd.read());
    }

    public void setCPU(CPU cpu){
        this.cpu = cpu;
    }

    public void setDisplay(Display display){
        this.display = display;
    }

    public void setUSB(CD cd){
        this.cd = cd;
    }

    public void setSound(Sound sound){
        this.sound = sound;
    }
}

抽象同事类AbstractColleague:

public abstract class AbstractColleague {
    protected AbstractMediator mediator;
    public AbstractColleague(AbstractMediator mediator){
        this.mediator = mediator;
    }
}

具体同事类CPU:

public class CPU extends AbstractColleague {

    private String dataSound,dataVideo;

    public CPU(AbstractMediator mediator) {
        super(mediator);
    }
    public String getDataSound(){
        return dataSound;
    }
    public String getDataVideo(){
        return dataVideo;
    }

    public void decodeData(String data){
        //划分数据为数组,第一个为视频,第二个为音频
        String[] tmp = data.split(",");
        dataVideo = tmp[0];
        dataSound = tmp[1];
        //通知主板处理身份改变
        mediator.changed(this);
    }

}

具体同事类CD:

public class CD extends AbstractColleague {

    private String data;
    public CD(AbstractMediator mediator) {
        super(mediator);
    }

    public String read(){
        return data;
    }

    public void load(){
        data = "视频数据,音频数据";
        mediator.changed(this);
    }
}

具体同事类Display:

public class Display extends AbstractColleague {

    public Display(AbstractMediator mediator) {
        super(mediator);
    }

    public void display(String data){
        System.out.println("画面显示+"+data);
    }

}

具体同事类Sound:

public class Sound extends AbstractColleague {

    public Sound(AbstractMediator mediator) {
        super(mediator);
    }

    public void soundPlay(String data){
        System.out.println("声音来源+"+data);
    }
}

主类测试:

public class Test {

    public static void main(String[] args) {
        //构造主板
        MainBoard board = new MainBoard();
        //构造零件
        CPU cpu = new CPU(board);
        Display display = new Display(board);
        CD usb = new CD(board);
        Sound sound = new Sound(board);

        //各个零件安装到主板
        board.setUSB(usb);
        board.setDisplay(display);
        board.setCPU(cpu);
        board.setSound(sound);

        //插入usb播放数据
        usb.load();
    }

}

测试结果:

声音来源+音频数据
画面显示+视频数据

中介者模式总结
中介者模式就是用来协调多个对象之间的交互的,如果没有主板其他零件相互依赖,关系太复杂。中介模式的优点就是使得类之间的耦合度更小,使原本关系网状错杂的对象,变得结构清晰。中心就是中介者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值