@@@模式定义:
用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,
而且可以独立地改变他们之间的交互。
@@@练习示例:
使用电脑来看电影。
@@@示例代码:
\film\Mediator.java
\film\MotherBoard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\film\Colleague.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\film\CDDriver.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\film\CPU.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\film\VideoCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\film\SoundCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@@模式的实现:
1. 可以实现成广义中介者;
@@@模式的优点:
1. 松散耦合;
2. 集中控制交互;
3. 多对多变成一对多;
@@@模式的缺点:
1. 过度集中化;
@@@模式的本质:
封装交互。
@@@模式体现的设计原则:
NA
用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,
而且可以独立地改变他们之间的交互。
@@@练习示例:
使用电脑来看电影。
@@@示例代码:
\film\Mediator.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 中介者对象的接口
*/
public interface Mediator {
/**
* 同事对象在自身改变的时候来通知中介者的方法,
* 让中介者去负责相应的与其他同事对象的交互
* @param colleague 同事对象自身,好让中介者对象通过对象实例
* 去获取同事对象的状态
*/
public void changed(Colleague colleague);
}
\film\MotherBoard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 主板类, 实现中介者接口
*/
public class MotherBoard implements Mediator {
/**
* 需要知道要交互的同事类——光驱类
*/
private CDDriver cdDriver = null;
/**
* 需要知道要交互的同事类——CPU类
*/
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) {
// 表示CPU处理完了
this.opeCPU((CPU)colleague);
}
}
/**
* 处理光驱读取数据以后与其他对象的交互
* @param cd 光驱同事对象
*/
private void opeCDDriverReadData(CDDriver cd) {
// 1: 先获取光驱读取的数据
String data = cd.getData();
// 2: 把这些数据传递给CPU进行处理
this.cpu.executeData(data);
}
/**
* 处理CPU处理处理完数据后与其他对象的交互
* @param cpu CPU同事类
*/
private void opeCPU(CPU cpu) {
// 1: 先获取CPU处理后的数据
String videoData = cpu.getVideoData();
String soundData = cpu.getSoundData();
// 2: 把这些数据传递给显卡和声卡展示出来
this.videoCard.showData(videoData);
this.soundCard.soundData(soundData);
}
}
\film\Colleague.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 光驱类,一个同事类
*/
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
}
\film\CDDriver.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 光驱类,一个同事类
*/
public class CDDriver extends Colleague {
public CDDriver(Mediator mediator) {
super(mediator);
}
/**
* 光驱读取出来的数据
* (自身的业务状态数据)
*/
private String data = "";
/**
* 获取光驱读取出来的数据
* @return 光驱读取出来的数据
*/
public String getData() {
return this.data;
}
/**
* 读取光盘
* (业务方法,也是和中介者交互的方法)
*/
public void readCD() {
// 逗号前是视频显示的数据,逗号后是声音
this.data = "设计模式,值得好好研究";
// 通知主板,自己的状态发生了改变
this.getMediator().changed(this);
}
}
\film\CPU.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* CPU类, 一个同事类
*/
public class CPU extends Colleague {
public CPU(Mediator mediator) {
super(mediator);
}
/**
* 分解出来的视频数据
*/
private String videoData = "";
/**
* 分解出来的声音数据
*/
private String soundData = "";
/**
* 获取分解出来的视频数据
* @return 分解出来的视频数据
*/
public String getVideoData() {
return this.videoData;
}
/**
* 获取分解出来的声音数据
* @return 分解出来的声音数据
*/
public String getSoundData() {
return this.soundData;
}
/**
* 处理数据, 把数据分成音频和视频的数据
* @param data 被处理的数据
* (业务方法, 也是和中介者交互的方法)
*/
public void executeData(String data) {
// 把数据分解开, 前面的是视频数据, 后面的是音频数据
String[] ss = data.split(",");
this.videoData = ss[0];
this.soundData = ss[1];
// 通知主板, CPU的工作完成
this.getMediator().changed(this);
}
}
\film\VideoCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 显卡类, 一个同事类
*/
public class VideoCard extends Colleague {
public VideoCard(Mediator mediator) {
super(mediator);
}
/**
* 显示视频数据
* @param data 被显示的数据
*/
public void showData(String data) {
System.out.println("您正在观看的是: " + data);
}
}
\film\SoundCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package film;
/**
* 声卡类, 一个同事类
*/
public class SoundCard extends Colleague {
public SoundCard(Mediator mediator) {
super(mediator);
}
/**
* 按照声频数据发出声音
* @param data 发出声音的数据
*/
public void soundData(String data) {
System.out.println("画外音: " + data);
}
}
\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package user;
import film.CDDriver;
import film.CPU;
import film.MotherBoard;
import film.SoundCard;
import film.VideoCard;
public class Client {
public static void main(String[] args) {
// 1: 创建中介者——主板对象
MotherBoard mediator = new MotherBoard();
// 2: 创建同事类
CDDriver cd = new CDDriver(mediator);
CPU cpu = new CPU(mediator);
VideoCard vc = new VideoCard(mediator);
SoundCard sc = new SoundCard(mediator);
// 3: 让中介者知道所有的同事
mediator.setCdDriver(cd);
mediator.setCpu(cpu);
mediator.setVideoCard(vc);
mediator.setSoundCard(sc);
// 4: 开始看电影, 把光盘放入光驱, 光驱开始读盘
cd.readCD();
}
}
@@@模式的实现:
1. 可以实现成广义中介者;
@@@模式的优点:
1. 松散耦合;
2. 集中控制交互;
3. 多对多变成一对多;
@@@模式的缺点:
1. 过度集中化;
@@@模式的本质:
封装交互。
@@@模式体现的设计原则:
NA