- 浏览: 172729 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
String.intern()在全局常量池1.8在native ...
Java 内存模型 -
lgh1992314:
try with resource
Java GC的过程 -
lgh1992314:
JDK8 HotSpot 方法区在MetaSpace
Java 内存模型 -
空城回转:
永洁童心 写道最后的图中,在afterload_1步骤中,op ...
栈帧、局部变量表、操作数栈 -
永洁童心:
最后的图中,在afterload_1步骤中,operand s ...
栈帧、局部变量表、操作数栈
1.定义:
用一个中介对象封装一系列的对象交互,中介者使个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
2.解析:
这段话不明白没关系,我们先来看这样的一个场景:
公司有1个领导,9个职员,有一天领导要去公司的图书馆找一本书,领导一看图书馆的这本书已经被借走了,他就去问职员1有没有拿走,如果没有就继续问职员2……终于领导找到了他想看的书。
在这个例子中最差的情况下,领导对象竟然要和9个职员对象进行耦合,从我们软件设计的角度来看是相当不合理的。
我们把上面这个故事抽象成一个简单的程序就编程了这样的代码:
package _8MediatorPattern; public interface Staff { public void borrowBook(); public boolean bookIsBorrowed(); }
package _8MediatorPattern; import java.util.Date; public class Leader implements Staff { private Staff commonStaff; @Override public void borrowBook() { // 先看书在不在小职员手里 if(commonStaff.bookIsBorrowed()) { System.out.println("领导直接从图书馆借到了书!"); }else { System.out.println("领导从小职员手里拿到了书,很简单!"); } } @Override public boolean bookIsBorrowed() { // 随机产生,书有没有被借走 return new Date().getTime()/2 == 0; } public Staff getCommonStaff() { return commonStaff; } public void setCommonStaff(Staff commonStaff) { this.commonStaff = commonStaff; } }
package _8MediatorPattern; import java.util.Date; public class CommonStaff implements Staff { private Staff leader; @Override public void borrowBook() { if(leader.bookIsBorrowed()) { System.out.println("小员工直接从图书馆借到了书!"); }else { System.out.println("小员工从领导手里借到了书,不容易!"); } } @Override public boolean bookIsBorrowed() { // 随机产生,书有没有被借走 return new Date().getTime()/2 == 0; } public Staff getLeader() { return leader; } public void setLeader(Staff leader) { this.leader = leader; } }
我们可以看到无论是职员还是领导,他们之间都相互耦合了。
现在上面这个故事我们继续:领导在借了三次书以后终于不耐烦,他决定给公司招一个图书管理员。那么他每次借书的时候只要跟管理员打招呼就行了:XXX,帮我把Java编程思想拿过来。然后管理员就去查询谁拿走了书,然后把书送到领导手里。
好了,我们讲到这里故事就结束了,因为中介者已经出现了。没错,这个管理员就是中介者。
3.中介者模式的结构(中介者模式又称为调停者模式)
- 抽象中介者:抽象中介者角色定义统一的接口,用于各同事角色之间的通信。
- 具体中介者:具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色。
- 同事角色:每个同事角色都知道中介者角色 ,而且与其他的同事角色通信的时候,一定通过中介者角色协作。每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的状态,处理自己的行为等,这种方法叫做自发行为,与其他同事类或者中介者没有任何的依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。
4.中介者模式通用代码:
package _8MediatorPattern; /** * 通用抽象中介者 */ public abstract class Mediator { // 定义同事类 protected ConcreteColleage1 colleage1; protected ConcreteColleage2 colleage2; // 中介者模式的业务逻辑(依赖关系复杂的) public abstract void doSomething1(); public abstract void doSomething2(); public ConcreteColleage1 getColleage1() { return colleage1; } public void setColleage1(ConcreteColleage1 colleage1) { this.colleage1 = colleage1; } public ConcreteColleage2 getColleage2() { return colleage2; } public void setColleage2(ConcreteColleage2 colleage2) { this.colleage2 = colleage2; } }
package _8MediatorPattern; /** * 中介者具体类 */ public class ConcreteMediator extends Mediator { @Override public void doSomething1() { super.colleage1.selfMethod1(); // 依赖方法 super.colleage2.depMethod2(); } @Override public void doSomething2() { // 依赖方法 super.colleage1.depMethod1(); super.colleage2.selfMethod2(); } }
package _8MediatorPattern; /** * 抽象同事类 */ public abstract class Colleage { protected Mediator mediator; public Colleage(Mediator mediator) { this.mediator = mediator; } }
package _8MediatorPattern; /** * 同事类1 */ public class ConcreteColleage1 extends Colleage { // 通过构造函数传递中介者 public ConcreteColleage1(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod1() { } // 依赖方法 dep-method public void depMethod1() { super.mediator.doSomething1(); } }
package _8MediatorPattern; /** * 同事类2 */ public class ConcreteColleage2 extends Colleage { // 通过构造函数传递中介者 public ConcreteColleage2(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod2() { } // 依赖方法 dep-method public void depMethod2() { super.mediator.doSomething2(); } }
5.中介者模式的使用场景:
中介者模式适用于多个对象之间紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。在这种情况下一定要考虑使用中介者模式,这有利于把蜘蛛网梳理为星型结构,使原本复杂混乱的关系变得清晰简单。
中介者模式虽然简单,但不代表易用。在OOP中对象必然会存在依赖关系,中介者模式未必能把原来凌乱的逻辑整理的清清楚楚,而且中介者模式也是有缺点的,使用不当,缺点会被无限放大。
6.中介者模式的优点:
中介者模式的优点就是减少类间的依赖,把原本的一对多依赖编程了一对一依赖,同事类只依赖中介者,减少了依赖,同事也降低了类间的耦合。
7.中介者模式的缺点:
中介者模式的缺点是中介者会膨胀的很大,而且逻辑复杂,原本N个对象直接相互依赖的关系转换成了中介者和同事类的依赖关系,同事类越多,中介者的逻辑越复杂。
8.中介者模式的实际应用:
- 机场的调度中心
- MVC框架中的Controller
- 媒体网关,比如QQ的聊天服务器
- 中介服务,比如房产中介
发表评论
-
设计模式代码-仅供参考
2012-11-26 17:13 819学完设计模式,示例代码保存着,以后看看。 -
23.桥梁模式(Bridge Pattern)
2012-11-26 17:09 18271.定义 将抽象和实现解耦,使得两者可以独立地变化 ... -
22.享元模式(Flyweight Pattern)
2012-11-26 14:55 14161.定义 使用共享对象可有效地支持大量的细粒度的对象。 是 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 45401.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
20.状态模式(State Pattern)
2012-11-22 14:02 13081.定义 当一个对象内在状态改变时,允许其改变行为,这个对象 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 1940话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1063引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10441.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15511.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18001.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 11761.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13511.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11211.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10491.定义 动态地给一个对 ... -
10.责任链模式(Chain of Responsibility)
2012-11-07 16:15 10551.定义: 使多个对象都有机会处理请求,从而避免了请求的发送 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10041.定义 将一个请求封装 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13271.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11301.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10281.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1160定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式...
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式...
18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式...
中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23...
咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停...
主要介绍了Java设计模式之中介者模式(Mediator Pattern),需要的朋友可以参考下
18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State ...
中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式...
提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式(Mediator Pattern) 装饰模式...
php /** * 中介者模式 * * 用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ abstract class Mediator { abstract public function send($...
Java设计模式学习教程与案例源码.zip 设计模式 ======= [设计模式专题]...11. [中介者模式](worthed/OriginBlog/blob/master/articles/MediatorPattern.md)
第 21 章 中介者模式【MEDIATOR PATTERN】 .......................................................................................... 256 第 22 章 解释器模式【INTERPRETER PATTERN】 .........................
中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 策略模式(Strategy Pattern) 模板方法模式(Template Method ...
23种设计模式(Design Pattern)的C++实现范例,包括下面列...中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)
中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template ...
遍历聚合对象中的元素——迭代器模式(四) 遍历聚合对象中的元素——迭代器模式(五) 遍历聚合对象中的元素——迭代器模式(六) 中介者模式-Mediator Pattern 协调多个对象之间的交互——中介者模式(一) 协调多...