设计模式->行为型模式->中介者模式
来源:互联网 发布: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"); }}
- 设计模式--行为型--中介者模式
- 行为型设计模式-中介者模式
- 设计模式-行为-中介者
- 设计模式 - 行为型模式 - 中介者模式
- 设计模式之------行为型模式(一)-----中介者模式
- 设计模式->行为型模式->中介者模式
- Mediator中介者(行为型设计模式)
- 行为设计模式---中介者模式(Mediator)
- 设计模式笔记--行为型模式之五--中介者
- 设计模式笔记(17)---中介者模式(行为型)
- 设计模式(17)-行为型-中介者模式(Mediator)
- 设计模式20:中介者模式【行为型】
- java设计模式(行为型)之中介者模式
- 设计模式--中介者模式Mediator(行为型)
- [设计模式-行为型]中介者模式(Mediator)
- 设计模式(行为型)之中介者模式(Mediator Pattern)
- 设计模式-行为型之中介者模式
- 行为型:设计模式之中介者模式(十四)
- POJ3159 最大差距(差分约束系统) (K)
- PAT b1031-b1035题解
- CentOS_6.5下安装tomcat-7.0.69
- 【C语言】操作符
- 并发基础_1_序
- 设计模式->行为型模式->中介者模式
- 古文观止卷七_諫太宗十思疏_魏徵
- 数据结构学习-栈
- JavaScript基础笔记_17-07-10
- eclipse装插件
- LocalBroadcastManager机制分析
- 遇到多个构造器参数时要考虑用构建器
- ES5 Array
- leetcode 381. Insert Delete GetRandom O(1)