Behavioral模式之Mediator模式

来源:互联网 发布:淘宝网家居拖鞋 编辑:程序博客网 时间:2024/05/20 20:03

1.意图

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

2.别名

3.动机

面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。

4.适用性

以下情况使用Mediator模式:

  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

5.结构

中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。先看看图:
Mediator模式
User类统一接口,User1和User2分别是不同的对象,二者之间有关联,如果不采用中介者模式,则需要二者相互持有引用,这样二者的耦合度很高,为了解耦,引入了Mediator类,提供统一接口,MyMediator为其实现类,里面持有User1和User2的实例,用来实现对User1和User2的控制。这样User1和User2两个对象相互独立,他们只需要保持好和Mediator之间的关系就行,剩下的全由MyMediator类来维护!

6.代码示例

实现代码:

public interface Mediator {    public void createMediator();    public void workAll();}

中介类

public class MyMediator implements Mediator {    private User user1;    private User user2;    public User getUser1() {        return user1;    }    public User getUser2() {        return user2;    }    @Override    public void createMediator() {        user1 = new User1(this);        user2 = new User2(this);    }    @Override    public void workAll() {        user1.work();        user2.work();    }}user类

public abstract class User {

private Mediator mediator;public Mediator getMediator(){    return mediator;}public User(Mediator mediator) {    this.mediator = mediator;}public abstract void work();

}

public class User1 extends User {

public User1(Mediator mediator){    super(mediator);}@Overridepublic void work() {    System.out.println("user1 exe!");}

}

public class User2 extends User {

public User2(Mediator mediator){    super(mediator);}@Overridepublic void work() {    System.out.println("user2 exe!");}

}

测试类:

public class Test {    public static void main(String[] args) {        Mediator mediator = new MyMediator();        mediator.createMediator();        mediator.workAll();    }}

输出:
user1 exe!
user2 exe!

7.相关模式

  • Facade与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但反之则不行。相反,Mediator提供了个Colleague对象不支持或不能支持的协作行为,而且协议是多向的。
  • Colleague可使用Observer模式与Mediator通信。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539

0 0
原创粉丝点击