本文共 2935 字,大约阅读时间需要 9 分钟。
在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改,这叫作“牵一发而动全身”,非常复杂。
如果把这种“网状结构”改为“星形结构”的话,将大大降低它们之间的“耦合性”,这时只要找一个“中介者”就可以了。如前面所说的“每个人必须记住所有朋友电话”的问题,只要在网上建立一个每个朋友都可以访问的“通信录”就解决了。这样的例子还有很多,例如,你刚刚参加工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
中介者模式包含以下主要角色。
定义抽象中介者角色:
package com.siyi.mediatorpattern;//抽象中介者abstract class Mediator { public abstract void register(Colleague colleague); public abstract void relay(Colleague cl); //转发}
定义具体中介者角色:
package com.siyi.mediatorpattern;import java.util.ArrayList;import java.util.List;//具体中介者public class ConcreteMediator extends Mediator { private Listcolleagues = new ArrayList (); public void register(Colleague colleague) { if (!colleagues.contains(colleague)) { colleagues.add(colleague); colleague.setMedium(this); } } public void relay(Colleague cl) { for (Colleague ob : colleagues) { if (!ob.equals(cl)) { ob.receive(); } } }}
定义抽象同事角色:
package com.siyi.mediatorpattern;//抽象同事类public abstract class Colleague { protected Mediator mediator; public void setMedium(Mediator mediator) { this.mediator = mediator; } public abstract void receive(); public abstract void send();}
定义具体同事角色:
package com.siyi.mediatorpattern;//具体同事类public class ConcreteColleague1 extends Colleague { public void receive() { System.out.println("具体同事类1收到请求。"); } public void send() { System.out.println("具体同事类1发出请求。"); mediator.relay(this); //请中介者转发 }}---------------------------------------------------package com.siyi.mediatorpattern;//具体同事类public class ConcreteColleague2 extends Colleague { public void receive() { System.out.println("具体同事类2收到请求。"); } public void send() { System.out.println("具体同事类2发出请求。"); mediator.relay(this); //请中介者转发 }}
主方法:
package com.siyi.mediatorpattern;public class Main { public static void main(String[] args) { Mediator md = new ConcreteMediator(); Colleague c1 = new ConcreteColleague1(); Colleague c2 = new ConcreteColleague2(); //注册同事信息 md.register(c1); md.register(c2); //发送消息 c1.send(); c2.send(); }}
运行结果:
具体同事类1发出请求。具体同事类2收到请求。具体同事类2发出请求。具体同事类1收到请求。
优点:
缺点:
转载地址:http://vryof.baihongyu.com/