设计模式->行为型模式->中介者模式

来源:互联网 发布:eclipse怎么编写java 编辑:程序博客网 时间:2024/06/11 14:51

1.定义:使用一个中介者对象来封装一系列的对象交互。中介者是对象之间不需要显示的互相引用。从而使个各个对象之间松耦合,而且可以独立的改变它们之间的交互

2.UML


3.涉及角色

1.抽象中介者:定义了同事类到中介对象的接口,同时负责对象之间的交互该行为被延迟到子类

2.抽象同事类:持有中介角色实例,也可以理解为将中介角色注册到抽象同事类中,凡是抽象同事类的子类都会持有中介角色实例,因为具体同事类之间的交互需要通过中介角色,也就说同事类必须知道中中介角色

3.具体中介角色:持有部分或者所有具体同事类,该角色需要协调各个具体同事类之间的交互,

4.具体同事类:由于每一个具体同事类都是抽象同事类的子类,所以每一个同事类都持有中介角色,并且必须要通过中介角色和其他同事类通信。

该角色具有两种行为

 1.自发行为:该具体同事类自己的行为,也就说该行为不依赖于其他同事角色和中介角色

2.依赖行为:必须依赖中介角色才能完成,也就是该行为的完成需要依赖于其他同事对象以及中介角色

4.优点

1.减少类之间的依赖,将原来一对多的一依赖转化成一对一的依赖,各个同事类只依赖中介,降低各个同事类之间的耦合,

2.由于中介角色降低了各个同事类之间的耦合,使得可以对立的复用和改变各个同事类以及中介类

3.把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,关注的对象就从对象各自的行为转移到对象之间的交互上。站在一个更加宏观的角度上来看待系统

5.缺点

由于控制集中化,将交互复杂性转变为中介者的复杂性,使得中介者异常的复杂。同事类越多中介者也复杂。可以按照不同职责将具体中介者划分

6.使用场景

1.一组对象以定义良好但以复杂的方式进行交互通行的场景

2.定制一个分布在多个类中的行为而有不想产生太多的子类

3.系统交互中寻在网状结构时也就说多个对象彼此依赖

7.Code

//抽象中介者

//抽象中介者public interface MainBoard {    public void nofity(Colleague colleague);}
//抽象同事类
//抽象同事类public abstract class Colleague {    //强制子类持有中介者,也就说中介可以不用持有所有的同事类,但是同事类必须要持有中介者    private MainBoard mainBoard;    public Colleague(MainBoard mainBoard) {        this.mainBoard = mainBoard;    }    public MainBoard getMainBoard() {        return mainBoard;    }}
//具体同事类
public class CDDirver extends Colleague {    private String data;    public CDDirver(MainBoard mainBoard) {        super(mainBoard);    }    public String getData() {        return data;    }    public void readDataFromCD() {         this.data = "11111,22222";        //数据读取完成,通知中介        this.getMainBoard().nofity(this);    }}public class CPU extends Colleague {    private String videioData = null;    private String soundData = null;    public CPU(MainBoard mainBoard) {        super(mainBoard);    }    public String getVideioData() {        return videioData;    }    public String getSoundData() {        return soundData;    }    //依赖方法    public void praseData(String data) {        String[] dataarr = data.split(",");        this.videioData = dataarr[0];        this.soundData = dataarr[1];        //通知中介(主板)CPU解析数据完成        this.getMainBoard().nofity(this);    }    //自有方法    public String selfMethod() {        return "";    }}public class SoundCard extends Colleague {    public SoundCard(MainBoard mainBoard) {        super(mainBoard);    }    public void showSoundData(String data) {        System.out.println("sound data: " + data);    }}public class VideioCard extends Colleague {    public VideioCard(MainBoard mainBoard) {        super(mainBoard);    }    public void showVideioData(String data) {        System.out.println("videio data: " + data);    }}

//具体中介类

public class ConcreteMainBoard implements MainBoard {    //中介需要持有同事类实例,但是未必是所有同事类    private CPU cpu;    private CDDirver cdDirver;    private SoundCard soundCard;    private VideioCard videioCard;    public CPU getCpu() {        return cpu;    }    public void setCpu(CPU cpu) {        this.cpu = cpu;    }    public CDDirver getCdDirver() {        return cdDirver;    }    public void setCdDirver(CDDirver cdDirver) {        this.cdDirver = cdDirver;    }    public SoundCard getSoundCard() {        return soundCard;    }    public void setSoundCard(SoundCard soundCard) {        this.soundCard = soundCard;    }    public VideioCard getVideioCard() {        return videioCard;    }    public void setVideioCard(VideioCard videioCard) {        this.videioCard = videioCard;    }    @Override    public void nofity(Colleague colleague) {        if(colleague instanceof CDDirver) {            openCD((CDDirver) colleague);        } else if (colleague instanceof CPU) {            openCpu((CPU) colleague);        }    }    private void openCD(CDDirver cdDirver) {        this.cpu.praseData(cdDirver.getData());    }    private void openCpu(CPU cpu) {        this.soundCard.showSoundData(cpu.getSoundData());        this.videioCard.showVideioData(cpu.getVideioData());    }}
客户端

public class Client {    public static void main(String[] args) {        //1创建中介者        ConcreteMainBoard concreteMainBoard = new ConcreteMainBoard();        //2.创建同事类,并让同事类知道中介者        CPU cpu = new CPU(concreteMainBoard);        CDDirver cdDirver = new CDDirver(concreteMainBoard);        SoundCard soundCard = new SoundCard(concreteMainBoard);        VideioCard videioCard = new VideioCard(concreteMainBoard);        //3.将所有的同事类注册到中介        concreteMainBoard.setCpu(cpu);        concreteMainBoard.setCdDirver(cdDirver);        concreteMainBoard.setSoundCard(soundCard);        concreteMainBoard.setVideioCard(videioCard);        cdDirver.readDataFromCD();        cpu.praseData("aaaaaaa,ssssssss");    }}

原创粉丝点击