设计模式入门之中介者模式Mediator
2014-04-24 22:20
411 查看
//中介者模式:用一个中介对象来封装一系列的对象交互。中介者使得各对象不许要显式地相互引用从而使其耦合松散,而且可以独立地改变他们之间的交互 //本质:封装交互 //优点:松散耦合,集中控制交互,多对多变成一对多 //缺点:潜在都缺点-过度集中化 //实例:用电脑光驱看电影都例子 //首先,主板充当着中介者的作用,CPU,光驱,显卡,声卡都是同事类 //定义所有同事的抽象父类,每个类都需要把自己的状态告诉中介者,所以用抽象类 public abstract class Colleague { private Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } public Mediator getMediator() { return mediator; } } //光驱功能:输入影像和声音数据 public class CDDriver extends Colleague { public CDDriver(Mediator mediator) { super(mediator); } private String data = ""; public String getData() { return this.data; } public void readCD() { this.data = "设计模式,值得好好研究"; this.getMediator().changed(this); } } //CPU功能:处理数据,得到影像和声音 public class CPU extends Colleague { public CPU(Mediator mediator) { super(mediator); } private String videoData = ""; private String soundData = ""; 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().changed(this); } } //显卡功能:输出图像 public class VideoCard extends Colleague { public VideoCard(Mediator mediator) { super(mediator); } public void showData(String data) { System.out.println("您正在收看的是:"+data); } } //声卡功能:输出声音 public class SoundCard extends Colleague { public SoundCard(Mediator mediator) { super(mediator); } public void soundData(String data) { System.out.println("话外音:"+data); } } //中介者对象的接口 public interface Mediator { public void changed(Colleague colleague); } //主板功能:充当中介者,负责各个同事之间的交互 public class MotherBoard implements Mediator { private CDDriver cdDriver = null; private CPU cpu = null; private VideoCard videoCard = null; private SoundCard soundCard = null; //让中介者得到(知道)各个同事 public void setCdDriver(CDDriver cdDriver) { this.cdDriver = cdDriver; } public void setCPU(CPU cpu) { this.cpu = cpu; } public void setVideoCard(VideoCard videoCard) { this.videoCard = videoCard; } public void setSoundCard(SoundCard soundCard) { this.soundCard = soundCard; } public void changed(Colleague colleague) { if(colleague == cdDriver) { //表示读完数据了 this.opeCDDriverReadData((CDDriver)colleague); }else if(colleague == cpu) { //表示处理完数据了 this.opeCPU((CPU)colleague); } } private void opeCDDriverReadData(CDDriver cd) { String data = cd.getData(); this.cpu.executeData(data); } private void opeCPU(CPU cpu) { String videoData = cpu.getVideoData(); String soundData = cpu.getSoundData(); this.videoCard.showData(videoData); this.soundCard.soundData(soundData); } } //客户端 public class Client { public static void main(Stirng[] args) { //由于只有一个中介者,而且基本没有扩展都要求,所以没有用接口 MotherBoard mediator = new MotherBoard(); //让同事们知道中介者 CDDriver cd = new CDDriver(mediator); CPU cpu = new CPU(mediator); VideoCard vc = new VideoCard(mediator); SoundCard sc = new SoundCard(mediator); //让中介者知道同事们 mediator.setCdDriver(cd); mediator.setCPU(cpu); mediator.setVideoCard(vc); mediator.setSoundCard(sc); //开始看电影,把光盘放入光驱,光驱开始读盘 cd.readCD(); } } //所有的同事类都通过changed方法来通知中介者他有需求了,或者说业务完成了 //所有的同事类都不用知道任何一个同事,他只需要通过changed与中介者交互就ok了 //然后中介者来完成所有的交互工作 //由于需要让客户端来触发光驱的改变,所以在客户端直接调用cd的readCD方法 //================================================================ //在实际开发中,这样都中介者模式会有问题,因此会简化中介者模式,成为广义中介者模式 //1.通常会去掉同事类的父类,这样可以让任意的对象,只要有需求就可以成为同事 //2.通常不定义Mediator接口,并把具体的中介者实现为单例 //3.同事对象不再持有中介者,而是在需要都时候直接获取中介者对象并调用 //4.中介者也不再持有同事对象,而是在具体处理方法里边去创建,获取,或者从参数传入需要的同事对象 //================================================================ //相关模式:外观模式 //1.外观模式多用来封装一个子系统内部的多个模块,目的是向子系统外部提供简单易用的接口。 //而中介者模式是提供多个平等的同事对象之间交互关系的封装,一般是用在内部实现上 //2.外观者模式是实现单向的交互,是从子系统外部来调用子系统内部,不会反着来 //而中介者模式实现的是内部多个模块间多向的交互
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之创建型模式
- 介绍php设计模式中的工厂模式
- 面向对象设计模式的核心法则
- 常见的PHP五种设计模式小结
- 小议javascript 设计模式 推荐
- javascript 设计模式之单体模式 面向对象学习基础
- 最常用的12种设计模式小结
- php设计模式 Command(命令模式)
- php设计模式介绍之值对象模式第1/5页
- 设计模式之构建(Builder)模式 建造房子实例分析
- Javascript 设计模式(二) 闭包
- javascript学习笔记(九) js对象 设计模式
- ASP.NET的适配器设计模式(Adapter)应用详解
- PHP设计模式之调解者模式的深入解析
- js如何实现设计模式中的模板方法
- 设计模式中的备忘录模式解析及相关C++实例应用
- 代理角色java设计模式之静态代理详细介绍