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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。