public abstract class Mediator {
protected ArrayList<Colleague> colleagues; //用于存储同事对象
//注册方法,用于增加同事对象
public void register(Colleague colleague) {
colleagues.add(colleague);
}
//声明抽象的业务方法
public abstract void operation();
}
ConcreteMediator:具体中介者
public class ConcreteMediator extends Mediator {
//实现业务方法,封装同事之间的调用
public void operation() {
...
//通过中介者调用同事类的方法
((Colleague)(colleagues.get(0))).method1();
...
}
}
Colleague:抽象同事类,维持了一个抽象中介者的引用,用于调用中介者的方法
public abstract class Colleague {
//维持一个抽象中介者的引用
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
//定义自身方法,处理自己的行为
public abstract void method1();
//定义依赖方法,与中介者进行通信
public void method2() {
mediator.operation();
}
}
ConcreteColleague:具体同事类
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
//实现自身方法
public void method1() {
......
}
}
public abstract class Colleague {
//维持一个抽象中介者的引用
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
public Mediator getMediator(){
return this.mediator;
}
}
ConcreteColleague:有四个,分别是光驱、CPU、显卡、声卡
public class CDDriver extends Colleague{
public CDDriver(Mediator mediator){
super(mediator);
}
//光驱读取的数据
private String data;
public String getDate(){
return this.data;
}
public void readCD(){
//模拟CD数据
this.data="[声音信息...],[视频信息...]";
//通过中介调用依赖方法:通知主板,自己读取到了数据data
this.getMediator.change(this);
}
}
public class CPU extends Colleague{
public CPU(Mediator mediator){
super(mediator);
}
//解析出的视频数据
private String vedioData;
//解析出的音频数据
private String soundDate;
public String getVedioDate(){
return this.vedioData;
}
public String getSound(){
return this.sooundData;
}
//解析数据
public void resolveData(String cdData){
//解析CDDriver读取的原始CD数据
String[] data = cdData.split(",");
this.soundDate = data[0];
this.vedioDate = data[1];
//通过中介调用依赖方法:通知主板,自己解析数据了
this.getMediator.change(this);
}
}
public class VedioCard extends Colleague{
public VedioCard(Mediator mediator){
super(mediator);
}
public void showVedio(String vedioData){
System.out.print("正在观看:" + vedioData);
}
}
public class SoundCard extends Colleague{
public SoundCard(Mediator mediator){
super(mediator);
}
public void playSound(String soundData){
System.out.print("画外音:" + soundData);
}
}
Mediator
public interface Mediator{
void changed(Colleague colleague);
}
ConcreteMediator,中介的具体实现,即主板
public class MotherBoard implements Mediator{
private CDDriver cdDriver;
private CPU cpu;
private VedioCard vedioCard;
private SoundCard soundCard;
public void setCDDriver(CDDriver driver){
this.cdDriver = driver;
}
public void setCPU(CPU cpu){
this.cpu = cpu;
}
public void setVedioCard(VedioCard vedioCard){
this.vedioCard = vedioCard;
}
public void setSoundCard(SoundCard soundCard){
this.soundCard = soundCard;
}
public void changed(Colleague col){
if(col == this.cdDriver){
//获取光驱读取的数据
String data = col.getData();
//交给CPU解析
this.cpu.resolveData(data);
}else if(col == this.cpu){
//获取CPU解析出的信息
String vedio = col.getVedioData();
String sound = col.getSoundData();
//交给声卡和显卡去显示或播放
this.vedioCard.showVedio(vedio);
this.soundCard.playSound(sound);
}
}
}
Client
public class Client{
public static void main(String[] args){
//创建中介
Mediator mediator = new MotherBoard();
//创建同事类
CDDriver driver = new CDDriver(mediator);
CPU cpu = new CPU(mediator);
VedioCard vedioCard = new VedioCard(mediator);
SoundCard soundCard = new SoundCard(mediator);
//让中介知道所有同事类
mediator.setCDDriver(driver);
mediator.serCPU(cpu);
mediator.setVedioCard(vedioCaard);
mediator.setSoundCard(soundCard);
//开始看电影
driver.readCD();
}
}
//输出如下
正在播放:[视频信息...]
画外音:[声音信息...]