1.定义
用一个对象来封装一系列的对象交互。中介者使各对象不需要显示的互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.优点
- 中介者的出现降低了各个交互对象之间的耦合性,使得可以独立和复用所有的交互对象类、中介者类。
- 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
3.缺点
- 由于中介者控制出现了集中化,于是交互复杂性变成了中介者的复杂性,这就使得中介者变得比任何一个交互类都复杂。所以说它的缺点来源于它的优点。
4.适用场景
一组对象以定义良好但是复杂的方式进行通信的场合。
5.UML图
6.例子
- 场景: 美国和朝鲜之间的对话需要通过联合国安理会。美国和朝鲜就是通信的具体类;联合国安理会就是具体中介者。
- UML图:
code:
- 代码结构图
代码
代码部分1
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 12:38 * @ProjectName: JavaBaseTest */ public abstract class Colleague { Mediate mediate; public void setMediate(Mediate mediate) { this.mediate = mediate; } public abstract void send(String sendInfo); public abstract void receive(String getInfo); }
代码部分2
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 13:55 * @ProjectName: JavaBaseTest */ public class ConcreteColleague1 extends Colleague{ @Override public void send(String sendInfo) { System.out.println("提申请::朝鲜->联合国安理会:"+sendInfo); super.mediate.declare(sendInfo,this); } @Override public void receive(String getInfo) { System.out.println("收通知::联合国安理会->朝鲜:"+getInfo); } }
代码部分3
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 14:19 * @ProjectName: JavaBaseTest */ public class ConcreteColleague2 extends Colleague { @Override public void send(String sendInfo) { System.out.println("提申请::美国->联合国安理会:"+sendInfo); super.mediate.declare(sendInfo,this); } @Override public void receive(String getInfo) { System.out.println("收通知::联合国安理会->美国:"+getInfo); } }
代码部分4
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 14:22 * @ProjectName: JavaBaseTest */ public class ConcreteMediate extends Mediate { private ConcreteColleague1 concreteColleague1; private ConcreteColleague2 concreteColleague2; public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) { this.concreteColleague1 = concreteColleague1; } public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) { this.concreteColleague2 = concreteColleague2; } @Override public void declare(String messgae, Colleague colleague) { if(colleague instanceof ConcreteColleague1 && concreteColleague1!=null){ concreteColleague1.receive("朝鲜须接受美国提出的任何条件!"); }else if(colleague instanceof ConcreteColleague2 && concreteColleague2!=null){ concreteColleague2.receive("美国可以向朝鲜提出任何条件!"); }else{ System.out.println("error"); } } }
代码部分5
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 14:40 * @ProjectName: JavaBaseTest */ public class Main { public static void main(String[] args) { ConcreteColleague1 Korea=new ConcreteColleague1();//朝鲜 ConcreteColleague2 USA=new ConcreteColleague2();//美国 ConcreteMediate mediate=new ConcreteMediate();//联合国安理会 mediate.setConcreteColleague1(Korea); mediate.setConcreteColleague2(USA); Korea.setMediate(mediate); USA.setMediate(mediate); Korea.send("请求联合国安理会支持朝鲜半岛的统一,杜绝美国的干涉"); System.out.println("--------------------------------我是分隔线----------------------------"); USA.send("请求联合国安理会驳回朝鲜期望统一的无理要求"); } }
代码部分6
package designmodel.chapter25; /** * @Author: cxh * @CreateTime: 18/2/20 12:38 * @ProjectName: JavaBaseTest */ public abstract class Mediate{ public abstract void declare(String messgae,Colleague colleague); }
- 代码结构图
参考书籍:《大话设计模式》-程杰