我是如何学习设计模式的七:中介者模式—和command模式,观察者模式有一定关系
中介者模式定义
中介者作为唯一知道其他类中方法细节的一个类,在类发生变化时通知中介者,中介者在将这些变化传递给其他需要通知的类
中介者作为唯一知道其他类中方法细节的一个类,在类发生变化时通知中介者,中介者在将这些变化传递给其他需要通知的类
中介者模式的效果:
1 当一个类的动作要受另一个类的状态影响时,中介者模式可以防止这些类变得混乱
2 使用中介者很容易修改一个程序的行为。
3 可以添加新的控件或类,除了改变中介者外,不用改动任何部分。
4 中介者解决了每个command对象要对用户接口中的其他对象和方法了解太多的问题
5 中介者变成了一个万能类,知道太多其他部分程序的信息,这会使他难以修改和维护。
6 每个中介者都是一个指定的类,要拥有的每个同事要调用方法,并知道每个同事有哪些可用的方法,这使得在不同项目中重用中介者变得很困难。
Mediator中介者模式定义:
用一个中介对象来封装一系列关于对象交互行为.
为何使用Mediator?
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性.
如何使用?
首先 有一个接口,用来定义成员对象之间的交互联系方式:
public interface Mediator { } |
Meiator具体实现,真正实现交互操作的内容:
public class ConcreteMediator implements Mediator { //假设当前有两个成员. ... } |
再看看另外一个参与者:成员,因为是交互行为,都需要双方提供一些共同接口,这种要求在Visitor Observer等模式中都是相同的.
public class Colleague { public class ConcreteColleague1 { } public class ConcreteColleague2 { } |
每个成员都必须知道Mediator,并且和 Mediator联系,而不是和其他成员联系.
至此,Mediator模式框架完成,可以发现Mediator模式规定不是很多,大体框架也比较简单,但实际使用起来就非常灵活.
Mediator模式在事件驱动类应用中比较多,例如界面设计GUI.;聊天,消息传递等,在聊天应用中,需要有一个MessageMediator,专门负责request/reponse之间任务的调节.
MVC是J2EE的一个基本模式,View Controller是一种Mediator,它是Jsp和服务器上应用程序间的Mediator.
将一些对象的相关功能集合在一格类中。乍看之下和单件模式没什么不同。深入看看模式的定义,才发现中介者模式的集合含义是不同的:单件模式是将相关的功能集合在某一类中,供给许多类使用,但这些类之间是没什么关系的。
中介者模式是将需要交互的类的交互功能合并在某个类中,这个类充当中介。也可以看成调度。这样做是为了降低类之间的耦合,中介者类也能充当一个交互的层或某些适配功能。
比如,我们有一个流程驱动,其中的某一个状态需要提交到下一操作。这时,是在状态类中派生使用下一个状态/操作类?还是提交给流程驱动类,由他来进行提交的处理呢?因为可能状态提交会带来某些额外的操作,或者流程是用户运行时决定的,这时当前状态是不知道下一状态是什么,就无法进行有效的编码。
或者,在某一个GUI中,某些成员(某个按钮,列表等)的变化将会影响到许多其他的成员,这时使用观察者模式将会比较复杂(可能是N*M),编码成本会比较高,又没有复用的可能,就可以考虑使用中介者模式了。
中介模式的组成部分
中介者模式的组成部分吧。
1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
通俗的例子
1婚姻介绍所
Mediator模式的概念Mediator模式是行为模式之一,Mediator模式定义一个对象来封装对象的交互行为。从而降低对象间的耦合程度。
在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。
Mediator模式的应用场景与利点当多个类之间相互依存,互相调用,关系过于复杂时,可以考虑使用Mediator模式来简化它们之间的关系。
使用Mediator模式时的优点
1,将系统按功能分割成更小的对象,符合类的最小设计原则
2,对关联对象的集中控制
3,减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。
4,有利于提高类的重用性
Mediator模式的应用范例下面,我们使用Mediator模式模拟男孩女孩找对象的行为:在Boy类中,需要调用Girl类的方法;相反,在Girl类中,也需要调用Boy类的方法。所以我们采用Mediator模式来实现这个过程。
文件一览:
Client
测试类
Mediator
Mediator中介者类,这里省略了抽象类
Person
关联类(Boy, Girl)的抽象类。关联类之间并不一定需要共享一个父类,这里为了方便,为他们抽象出一个Person类
Boy
关联类之Boy,跟Girl类相关联
Girl
关联类之Girl,跟Boy类相关联
代码:
public class Client {
/**
* Test Mediator Pattern
*/
public static void main(String[] args) {
//婚姻中介所开张了
Mediator mediator = new Mediator();
//一个名为Zhangshan的男孩,条件为80
Boy zhangshan = new Boy(mediator, "Zhangshan", 80);
Girl lili = new Girl(mediator, "Lili", 80);
//如果条件符合,则partner成立
zhangshan.findPartner(lili);
//一个名为lanlan的女孩,条件为90
Girl lanlan = new Girl(mediator, "lanlan", 90);
lanlan.findPartner(zhangshan);
}
}
/**
* 关联类(Boy, Girl)的抽象类
* 关联类之间并不一定需要共享一个父类,这里为了方便,为他们抽象出一个Person类
*/
abstract class Person {
//姓名
String name;
//条件
int condition;
//中介者(不管男孩还是女孩,都需要知道中介者,通过中介者去找对象)
Mediator mediator;
public Person(Mediator mediator, String name, int condition) {
this.mediator = mediator;
this.name = name;
this.condition = condition;
}
public abstract boolean findPartner(Person person);
public int getCondition() {
return condition;
}
public void setCondition(int condition) {
this.condition = condition;
}
public String getName() {
return name;
}-