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

来源:互联网 发布:淘宝刷销量在哪里找人 编辑:程序博客网 时间:2024/06/01 10:33

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

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

中介者模式的角色
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();    }}

测试结果:

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

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

0 0
原创粉丝点击