您的位置:首页 > 其它

设计模式入门之中介者模式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.外观者模式是实现单向的交互,是从子系统外部来调用子系统内部,不会反着来
//而中介者模式实现的是内部多个模块间多向的交互
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息