JAVA设计模式——中介者模式

中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式结构图

抽象中介者定义方法接收抽象Colleague,具体中介者定义需要接收的Colleague实体,调用具体Colleague的方法,抽象Colleague含有抽象中介者属性,具体Colleague含有具体通知方法。

优点:减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和具体中介者。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

缺点:由于具体中介者控制了集中化,把交互复杂性变为了中介者的复杂性,这就使得中介者比任何一个具体Colleague都复杂。

/**
 * 抽象中介者
 */
public abstract class Mediator {
    public abstract void Send(String msg,Colleague colleague);  //通知具体同事
}
/**
 * 具体中介者
 */
public class ConcreteMediator extends Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;
    public ColleagueA getColleagueA() {
        return colleagueA;
    }
    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }
    public ColleagueB getColleagueB() {
        return colleagueB;
    }
    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
    @Override
    public void Send(String msg, Colleague colleague) {
        if (colleague instanceof ColleagueA){
            colleagueA.notify(msg);
        }else if (colleague instanceof ColleagueB){
            colleagueB.notify(msg);
        }
    }
}
/**
 * 抽象同事
 */
public abstract class Colleague {
    private Mediator mediator;
    public Mediator getMediator() {
        return mediator;
    }
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}
/**
 * 同事A
 */
public class ColleagueA extends Colleague {
    public void send(String msg){
        this.getMediator().Send(msg,this);
    }
    public void notify(String msg){
        System.out.println("同事A得到消息:" + msg);
    }
}
/**
 * 同事B
 */
public class ColleagueB extends Colleague {
    public void send(String msg){
        this.getMediator().Send(msg,this);
    }
    public void notify(String msg){
        System.out.println("同事B得到通知:" + msg);
    }
}
public class Main {
    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();
        ColleagueA colleagueA = new ColleagueA();
        ColleagueB colleagueB = new ColleagueB();
        colleagueA.setMediator(concreteMediator);   //让同事认识中介者
        colleagueB.setMediator(concreteMediator);
        concreteMediator.setColleagueA(colleagueA); //让中介者认识具体同事
        concreteMediator.setColleagueB(colleagueB);
        concreteMediator.Send("第一条通知",colleagueA);
        concreteMediator.Send("第二条通知",colleagueB);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值