设计模式–中介者模式(Mediator)
来源:互联网 发布:淘宝精选怎么进去 编辑:程序博客网 时间:2024/06/08 16:31
设计模式–中介者模式(Mediator)
定义:
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互。
类型:
行为类模式。
类图:
中介者模式的结构:
中介者模式又称为调停者模式,从类图中看共分为3个部分
-抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现
-中介者实现类:从抽象者中介者接口中实现而来,实现抽象方法,从一个同事类接受消息,然后通过消息影响其他类。
-同事类:如果一个对象影响会影响其他对象,同时也会被其他的对象影响,那么这两个对象称为同事类。(下面有具体类图上面只是一个抽象)。在实际应用中 同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。在中介者模式中,同事类之间必须通过中介者才能进行消息传递
为什么要使用中介者结构
一般来说,同事类之间的关系是比较复杂的,多个同事类之间相互关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,既不利于类的复用,也不稳定
如下图有6个同事类对象当1改变时有4个要收到影响当2改变时有5个要受到影响
如果引入中介者模式 ,同事类之间的关系将会变成星型结构,从图可以看出, 当任何一个同事类发生改变,影响的只有自己本身和中介者类,这样就减少了系统的耦合 ,一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理不属于自己的行为。
概念扯了一大堆 废话不说了 来个具体事例-打开电脑看电影
比如有如下的交互:
1.首先光驱读取光盘上的数据,然后告诉主板,它的状态已经改变了。
2.主板得到光驱的数据,将数据交给CPU进行分析处理。
3.CPU处理完,将数据分成了视频数据和音频数据,通知主板,已将处理好了。
4.主板得到数据,将数据交给显卡和声卡进行输出。
来个类图看看
——————-
具体代码
import mediator2.colleague.Colleague;/*中介者接口*/public interface Mediator { void change(Colleague colleague);}/*中介者实现类*/public class ConcreteMediator implements Mediator{ private CDDriver cdDriver; private Cpu cpu; private VideoCard video; private SoundCard sound; public void setCdDriver(CDDriver cdDriver) { this.cdDriver = cdDriver; } public void setCpu(Cpu cpu) { this.cpu = cpu; } public void setVideo(VideoCard video) { this.video = video; } public void setSound(SoundCard sound) { this.sound = sound; } @Override public void change(Colleague colleague) { if(colleague==cdDriver){ getData((CDDriver)colleague); } if(colleague==cpu){ sendData((Cpu)colleague); } } private void getData(CDDriver cdDriver){ this.cpu.executeData(cdDriver.getData()); } private void sendData(Cpu cpu){ this.video.show(cpu.getVideoData()); this.sound.show(cpu.getSoundData()); }}/*同事类抽象类*/public abstract class Colleague {/*每个同事类都要知道中介者*/private Mediator mediator;public Colleague(Mediator mediator) { this.mediator = mediator;}/*获取当前同事的中介者类*/public Mediator getMediator() { return mediator;}}/*光驱读取数据*/public class CDDriver extends Colleague{private String data;public CDDriver(Mediator mediator,String data) { super(mediator); this.data=data;}/*读数据 读完通知中介者*/public void setData(String data) { this.data = data; this.getMediator().change(this);}public String getData() { return data;}}/*cpu*/public class Cpu extends Colleague{/*分解出来的图形数据*/private String videoData;/*分解出的声音数据*/private String soundData; public Cpu(Mediator mediator) { super(mediator); } public String getVideoData() { return videoData; } public String getSoundData() { return soundData; } /*处理数据*/ public void executeData(String data){ String [] ss=data.split(","); this.videoData=ss[0]; this.soundData=ss[1]; //通知中介者 this.getMediator().change(this); }}/*声卡*/public class SoundCard extends Colleague{ public SoundCard(Mediator mediator) { super(mediator); } public void show(String data){ System.out.println("你正在听:"+data); }}/*显卡*/public class VideoCard extends Colleague{ public VideoCard(Mediator mediator) { super(mediator); } public void show(String data){ System.out.println("你正在看:"+data); }}测试:public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); CDDriver cdDriver=new CDDriver(mediator, "video,sound"); Cpu cpu =new Cpu(mediator); SoundCard sound =new SoundCard(mediator); VideoCard video = new VideoCard(mediator); mediator.setCdDriver(cdDriver); mediator.setCpu(cpu); mediator.setSound(sound); mediator.setVideo(video); mediator.change(cdDriver);}你正在看:video你正在听:sound
每天扯蛋一点点。。。
- 设计模式–中介者模式(Mediator)
- Mediator(中介者)设计模式
- 设计模式(19)-中介者模式(Mediator)
- 设计模式之Mediator中介者模式
- 设计模式----Mediator(中介者)模式
- Java设计模式-----Mediator中介者模式
- 设计模式—Mediator中介者模式
- 设计模式--中介者模式(Mediator)
- 设计模式(21)-中介者模式(Mediator)
- 设计模式学习----Mediator中介者模式
- Java设计模式-----Mediator中介者模式
- 设计模式--中介者模式(Mediator)
- 设计模式之中介者模式(Mediator)
- 设计模式 17 - Mediator中介者模式
- [设计模式]Mediator中介者模式
- 设计模式------中介者模式(Mediator Pattern)
- 设计模式之中介者模式,mediator
- java设计模式--mediator 中介者模式
- linux 命令技巧
- android学习----overridePendingTransition参数讲解
- ODM(Oracle data mining)的简介
- 在linux中使用valgrind检测内存情况
- Windows7中搭建Android x86_64及armv8-a操作步骤
- 设计模式–中介者模式(Mediator)
- imp 全量导出,按用户导入
- magento get current variable 获取当前的通用变量
- jQuery函数
- mybatis 参数为list时,校验list是否为空, mybatis ${}与#{}的区别
- PCB 设计技巧一百问
- JFianl源码走读_7_Interceptor
- C语言宏定义时#(井号)和##(双井号)的用法
- 使基于导航栏的视图始终都能调用viewwillappear