中介者模式
类型:行为型
这个中介者负责与对象之间联系,对象与对象之间不再进行直接的交互,也就是对对象关系进行解耦
角色
- 抽象中介者(mediator):定义一个接口用于和对象通信(SmartDevice)
- 具体中介者(concretemediator):协调各同事对象实现协作,了解维护各个同事()
- 抽象同事角色(colleague):规定了同事的基本类型
- 具体同事角色(concreteColleague):每个同事都知道中介者对象,要与同事通信则把通信告诉中介者
UML
包结构
同事类
基类
package 中介者模式.colleague;
public abstract class AbstractColleague {
protected String book;
public String getBook() {
return book;
}
public void setBook(String book) {
this.book = book;
}
}
具体子类
package 中介者模式.colleague;
import 中介者模式.mediator.AbstractMediator;
public class Wang extends AbstractColleague{
public void giveBookToZhang(AbstractMediator mediator){
System.out.println("老王将书"+book+"给了中介者");
mediator.wangGiveZhang(super.book);
}
}
---------------------------------------------------------------
package 中介者模式.colleague;
import 中介者模式.mediator.AbstractMediator;
public class Zhang extends AbstractColleague{
public void giveBookToWang(AbstractMediator mediator){
System.out.println("老张将书"+book+"给了中介者");
mediator.zhangGiveWang(super.book);
}
}
中介者
基类
package 中介者模式.mediator;
import 中介者模式.colleague.AbstractColleague;
public abstract class AbstractMediator {
protected AbstractColleague wang;
protected AbstractColleague zhang;
public AbstractMediator(AbstractColleague wang, AbstractColleague zhang) {
this.wang = wang;
this.zhang = zhang;
}
public abstract void wangGiveZhang(String book);
public abstract void zhangGiveWang(String book);
}
具体子类
package 中介者模式.mediator;
import 中介者模式.colleague.AbstractColleague;
public class Mediator extends AbstractMediator {
public Mediator(AbstractColleague wang, AbstractColleague zhang) {
super(wang, zhang);
}
@Override
public void wangGiveZhang(String book) {
System.out.println("中介者得到了老王给来的书"+book+"并交给了老张");
super.zhang.setBook(book);
}
@Override
public void zhangGiveWang(String book) {
System.out.println("中介者得到了老张给来的书"+book+"并交给了老王");
super.wang.setBook(book);
}
}
客户端
package 中介者模式.client;
import 中介者模式.colleague.AbstractColleague;
import 中介者模式.colleague.Wang;
import 中介者模式.colleague.Zhang;
import 中介者模式.mediator.AbstractMediator;
import 中介者模式.mediator.Mediator;
public class Client {
public static void main(String[] args) {
Wang wang = new Wang();
Zhang zhang = new Zhang();
AbstractMediator mediator = new Mediator(wang,zhang);
System.out.println("--------先让老王获得书--------");
wang.setBook("《假如我有三天光明》");
System.out.println("---------再让老王把书给老张---------");
wang.giveBookToZhang(mediator);
System.out.println("-----------查看老张手上的书-----------");
System.out.println(zhang.getBook());
}
}
效果
--------先让老王获得书--------
---------再让老王把书给老张---------
老王将书《假如我有三天光明》给了中介者
中介者得到了老王给来的书《假如我有三天光明》并交给了老张
-----------查看老张手上的书-----------
《假如我有三天光明》
Process finished with exit code 0
模式优缺点
中介者模式很容易在系统中应用,也很容易在系统中误用,当系统出现了‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
优点:
- Mediator的出现减少了各个Colleague的耦合,使得可以独立的改变和复用各个ColleagueMediator;
- 由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了他们之间的交互上来,也就是站在一个更宏观的角度去看待系统
缺点
- 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。