中介者模式
设计模式文章中介者模式代理模式抽象工厂模式详解 —— head first 设计模式装饰者模式适配器模式策略模式观察者模式建造者模式 (Builder)概述中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须告诉其他所有的朋友修改,这叫作“牵一发而动全身”,非常复杂。 模式的定义与特点
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
其主要缺点是:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。 模式的结构与实现中介者模式实现的关键是找出“中介者”,下面对它的结构和实现进行分析。 1. 模式的结构中介者模式包含以下主要角色。
?
2. 模式的实现中介者模式的实现代码如下: package mediator; import java.util.*; public class MediatorPattern { static void main(String[] args) { Mediator md=new ConcreteMediator(); Colleague c1,c2; c1= ConcreteColleague1(); c2= ConcreteColleague2(); md.register(c1); md.register(c2); c1.send(); System.out.println("-------------"); c2.send(); } } //抽象中介者 abstract Mediator { register(Colleague colleague); void relay(Colleague cl); 转发 } 具体中介者 class ConcreteMediator extendsprivate List<Colleague> colleagues=new ArrayList<Colleague>(); register(Colleague colleague) { if(!colleagues.contains(colleague)) { colleagues.add(colleague); colleague.setMedium(this); } } relay(Colleague cl) { for(Colleague ob:colleagues) { ob.equals(cl)) { ((Colleague)ob).receive(); } } } } 抽象同事类 Colleague { protected Mediator mediator; setMedium(Mediator mediator) { this.mediator=mediator; } receive(); send(); } 具体同事类 class ConcreteColleague1 receive(){ System.out.println("具体同事类1收到请求。"); } send() { System.out.println("具体同事类1发出请求。"); mediator.relay(this); 请中介者转发 } } class ConcreteColleague2 receive(){ System.out.println("具体同事类2收到请求。" send(){ System.out.println("具体同事类2发出请求。" } } ?程序的运行结果如下: 具体同事类1发出请求。 具体同事类2收到请求。 ------------- 具体同事类2发出请求。 具体同事类1收到请求。 模式的应用场景前面分析了中介者模式的结构与特点,下面分析其以下应用场景。
模式的扩展在实际开发中,通常采用以下两种方法来简化中介者模式,使开发变得更简单。
下图是简化中介者模式的结构图。 程序代码如下:
SimpleMediatorPattern { main(String[] args) { SimpleColleague c1,1)"> SimpleConcreteColleague1(); c2= SimpleConcreteColleague2(); c1.send(); System.out.println("-----------------"); c2.send(); } } ?程序运行结果如下: 具体同事类1:发出请求... 具体同事类2:收到请求。 ----------------- 具体同事类2:发出请求... 具体同事类1:收到请求。 ? 观察者模式和中介者模式的异同1. 基本定义区别
相同点:
2. URML图区别:观察者模式: 中介者模式: 相同点:
3. 使用场景
参考文章中介者模式(详解版)? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |