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

xiaoxiao2021-02-28  81

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"); } }

转载请注明原文地址: https://www.6miu.com/read-47731.html

最新回复(0)