24种设计模式学习笔记之中介者模式

中介者模式(Mediator Pattern)----行为模式模式
定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。
其主要的目的是用来降低多个对象和类之间的通信复杂性。

UML图

 

 

中介者模式主要由这四个角色组成, 抽象中介者(Mediator)、具体中介者(ConcreteMediator)、 抽象同事类(Colleague)和具体同事类(ConcreteColleague) 。

  • 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
  • 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
  • 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

简单栗子代码

interface QQqun {
   void exchange(Person person,String message);
}

abstract class Person{
   protected String name;
   protected QQqun qun;  
   Person(String name,QQqun qun){
       this.name = name;
       this.qun = qun;
   }
}
class ZhangSan extends Person{

   ZhangSan(String name, QQqun qun) {
       super(name, qun);
   }
   
    void exchange(String message){
       qun.exchange(this,message);
   }
   
    void talk(String message){
       System.out.println(name +"说:" + message);
   }
}

class XuWuJing extends Person{

   XuWuJing(String name, QQqun qun) {
       super(name, qun);
   }
   
    void exchange(String message){
       qun.exchange(this,message);
   }
   
    void talk(String message){
       System.out.println(name +"回应:" + message);
   }
}
class JavaQQqun implements QQqun{
    private ZhangSan zs;
    private XuWuJing xwj;

    public ZhangSan getZs() {
        return zs;
    }

    public void setZs(ZhangSan zs) {
        this.zs = zs;
    }

    public XuWuJing getXwj() {
        return xwj;
    }


    public void setXwj(XuWuJing xwj) {
        this.xwj = xwj;
    }


    @Override
    public void exchange(Person person, String message) {
            if(zs.equals(person)){
                zs.talk(message);
            }else if(xwj.equals(person)){
                xwj.talk(message);
            }
    }
}
public static void main(String[] args) {
    JavaQQqun jq = new JavaQQqun();  
       ZhangSan zs = new ZhangSan("张三", jq);
       XuWuJing xwj = new XuWuJing("xuwujing", jq);
       jq.setZs(zs);
       jq.setXwj(xwj);      
       zs.talk("大家好!我是张三!");;
       xwj.talk("欢迎你!张三!");

}

优点:

灵活性高,因为将同事类进行了解耦,使其不必有关联性;
降低了类的复杂度,将一对多转化成了一对一;


缺点:
中介者使用过多,会使系统变得复杂难以维护;

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

posted @ 2020-03-04 10:10  小羊小恩  阅读(165)  评论(0)    收藏  举报