责任型模型之Mediator(中介者)模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值