我是如何学习设计模式的七:中介者模式—和command模式,观察者模式有一定关系

中介者模式定义

中介者作为唯一知道其他类中方法细节的一个类,在类发生变化时通知中介者,中介者在将这些变化传递给其他需要通知的类

中介者作为唯一知道其他类中方法细节的一个类,在类发生变化时通知中介者,中介者在将这些变化传递给其他需要通知的类

中介者模式的效果:

1 当一个类的动作要受另一个类的状态影响时,中介者模式可以防止这些类变得混乱

2 使用中介者很容易修改一个程序的行为。

3 可以添加新的控件或类,除了改变中介者外,不用改动任何部分。

4 中介者解决了每个command对象要对用户接口中的其他对象和方法了解太多的问题

5 中介者变成了一个万能类,知道太多其他部分程序的信息,这会使他难以修改和维护。

6 每个中介者都是一个指定的类,要拥有的每个同事要调用方法,并知道每个同事有哪些可用的方法,这使得在不同项目中重用中介者变得很困难。

Mediator中介者模式定义:
用一个中介对象来封装一系列关于对象交互行为.

为何使用Mediator?
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性.

如何使用?

首先 有一个接口,用来定义成员对象之间的交互联系方式:

public interface Mediator { }

Meiator具体实现,真正实现交互操作的内容:

public class ConcreteMediator implements Mediator {

   //假设当前有两个成员.
   private ConcreteColleague1 colleague1 = new ConcreteColleague1();
   private ConcreteColleague2 colleague2 = new ConcreteColleague2();

   ...

}

再看看另外一个参与者:成员,因为是交互行为,都需要双方提供一些共同接口,这种要求在Visitor Observer等模式中都是相同的.

public class Colleague {
   private Mediator mediator;
   public Mediator getMediator() {
      return mediator;
   }

   public void setMediator( Mediator mediator ) {
      this.mediator = mediator;
   }
}

public class ConcreteColleague1 { }

public class ConcreteColleague2 { }

每个成员都必须知道Mediator,并且和 Mediator联系,而不是和其他成员联系.

至此,Mediator模式框架完成,可以发现Mediator模式规定不是很多,大体框架也比较简单,但实际使用起来就非常灵活.

Mediator模式在事件驱动类应用中比较多,例如界面设计GUI.;聊天,消息传递等,在聊天应用中,需要有一个MessageMediator,专门负责request/reponse之间任务的调节.

MVCJ2EE的一个基本模式,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;

    }-

posted @ 2012-04-20 11:57  书奎  阅读(341)  评论(0编辑  收藏  举报