1.如果你期望将责任集中到某个类中,这个类可以监视其他对象的交互,可使用Mediator(中介者)模式
2.方式:标准中介者、广义中介者
3.举例(标准中介者)
//中介者抽象类
public interface Mediator {
void change(Colleague colleague);
}
//同事类,所有具体同事类的父类
public abstract class Colleague {
private final Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public Mediator getMediator(){
return mediator;
}
}
//中介者实现类:联系各同事类事务
public class MainBoard implements Mediator{
private CPU cpu;
private CDDevier cdDevier;
@Override
public void change(Colleague colleague) {
// TODO Auto-generated method stub
if(colleague==cdDevier){
this.getCDData((CDDevier)colleague);
}else if(colleague==cpu){
this.handleData((CPU)colleague);
}
}
private void handleData(CPU colleague) {
// TODO Auto-generated method stub
System.out.println("video: " + colleague.getVideoData());
System.out.println("sound: " + colleague.getSoundData());
}
private void getCDData(CDDevier colleague) {
// TODO Auto-generated method stub
this.cpu.exeData(colleague.getData());
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setCdDevier(CDDevier cdDevier) {
this.cdDevier = cdDevier;
}
}
//cpu具体同事类
public class CPU extends Colleague{
private String videoData;
private String soundData;
public CPU(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
public String getVideoData() {
return videoData;
}
public String getSoundData() {
return soundData;
}
public void exeData(String data){
String[] ss = data.split(",");
this.videoData = ss[0];
this.soundData = ss[1];
this.getMediator().change(this);
}
}
//cd设备具体同事类
public class CDDevier extends Colleague{
private String data;
public CDDevier(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
this.getMediator().change(this);
}
}
//测试类
public class Test {
public static void main(String[] args){
MainBoard mediator = new MainBoard();
CPU cpu = new CPU(mediator);
CDDevier cdDevier = new CDDevier(mediator);
mediator.setCpu(cpu);
mediator.setCdDevier(cdDevier);
cdDevier.setData("Video Data,Sound Data");
}
}
//结果
video: Video Data
sound: Sound Data
4.举例:(广义中介者)
//具体中介者对象实现成单例
public class MainBoard2 {
private CPU2 cpu2;
private CDDevier2 cdDevier2;
private static MainBoard2 mb2 = new MainBoard2();
private MainBoard2(){}
public static MainBoard2 getInstance(){
return mb2;
}
public void handleData() {
// TODO Auto-generated method stub
System.out.println("video: " + cpu2.getVideoData());
System.out.println("sound: " + cpu2.getSoundData());
}
public void getCDData() {
// TODO Auto-generated method stub
cpu2.exeData(cdDevier2.getData());
}
public void setCdDevier2(CDDevier2 cdDevier2) {
this.cdDevier2 = cdDevier2;
}
public void setCpu2(CPU2 cpu2) {
this.cpu2 = cpu2;
}
}
//cpu2同事类不再持有中介者对象,而是在具体处理方法里面去获取中介者对象单例
public class CPU2 {
String videoData;
String soundData;
public void exeData(String data){
String[] ss = data.split(",");
this.videoData = ss[0];
this.soundData = ss[1];
MainBoard2 mb2 = MainBoard2.getInstance();
mb2.handleData();
}
public String getVideoData() {
return videoData;
}
public String getSoundData() {
return soundData;
}
}
//CDDevier2同事类不再持有中介者对象,而是在具体处理方法里面去获取中介者对象单例
public class CDDevier2 {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
MainBoard2 mb2 = MainBoard2.getInstance();
mb2.getCDData();
}
}
//测试类
public class Test {
public static void main(String[] args){
CPU2 cpu2 = new CPU2();
CDDevier2 cdDevier2 = new CDDevier2();
MainBoard2 mb2 = MainBoard2.getInstance();
mb2.setCdDevier2(cdDevier2);
mb2.setCpu2(cpu2);
cdDevier2.setData("Video Data,Sound Data");
}
}
//结果
video: Video Data
sound: Sound Data
总结:Mediator(中介者)模式的意图是定义一个对象,该对象将对象集合之间的交互封装起来。利用该模式可以降低对象之间的耦合成都,避免对象之间的显示引用,还可以让对象间的交互独立变化。经过简化、变形的标准中介者称为广义中介者。
5.参考:http://www.cnblogs.com/zxj159/p/3466115.html