设计模式(十七)----- 中介者模式(Mediator)----(JAVA版)

来源:互联网 发布:为知笔记网页版登录 编辑:程序博客网 时间:2024/06/01 10:44

一:为什么我们要使用中介者模式:

    现实生活中,我们常见的中介包括房地产中介,婚姻中介,机场调度中心(调度每一辆飞机的起飞和降落等,这些中介起到的作用其实和中介者模式的作用是相类似的。如果没有房地产中介,众多租房者和售房者之间是一对一的网格复杂关系,但是引进了房地产中介后,我们的众多租房者和售房者只需要简单的把自己的需求告诉房地产中介,然后房地产中介就会帮助我们处理相关的事务,这样就把之前复杂的网格关系简化为以房地产中介为中心的星形关系,中介者简化了之前各对象的复杂关系,把网状结构到星形结构的转变是理解中介者模式比较好的途径,

          

二:中介者模式(Mediator)

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

优 点:减少了类之间的相互依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中间者,减少了依赖,当然也减少了类间耦合
缺 点:随着业务流程的复杂,中介者会膨胀很大,而且逻辑复杂

动 机:在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

中介者模式结构图描述:


三:参与者说明:

(1)Mediator :中介者接口

       在里面定义各个同事对象之间的交互对象,可以是公共的通信方法,比如changed 方法,大家都用,也可以是小范围的交互方法。

(2) ConcreteMediator:   具体中介者实现对象。
     他需要维护各个同事对象之间的交互关系,了解并维护它的各同事,实现协作作为

(3)Colleague :同事类的定义

     所有具体同事类的父类,通常实现成抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的功能。

(4)ConcreteColleague :具体的同事类

    实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者负责与其他的同事进行交互。


四:一个样例

(1)Mediator 

[java] view plaincopy
  1. package com.mediator.example;  
  2.   
  3. public abstract class Mediator {  
  4.  public abstract void notice(String content);  
  5. }  

(2) ConcreteMediator:  

[java] view plaincopy
  1. package com.mediator.example;  
  2.   
  3. import com.mediator.object.Dog;  
  4. import com.mediator.object.Sheep;  
  5.   
  6. public class MediatorImpl extends Mediator {  
  7.  private Dog dog;  
  8.  private Sheep sheep;  
  9.   
  10.  public MediatorImpl() {  
  11.   dog = new Dog();  
  12.   sheep = new Sheep();  
  13.  }  
  14.   
  15.  @Override  
  16.  public void notice(String content) {  
  17.   if (content.equals("bone"))  
  18.    dog.eat();  
  19.   if (content.equals("grass"))  
  20.    sheep.eat();  
  21.  }  
  22.   
  23. }  

(3)Colleague

[java] view plaincopy
  1. package com.mediator.object;  
  2.   
  3. public interface Animal {  
  4.  public void eat();  
  5. }  


(4)ConcreteColleague 
[java] view plaincopy
  1. package com.mediator.object;  
  2.   
  3. public class Dog implements Animal {  
  4.   
  5.  @Override  
  6.  public void eat() {  
  7.   System.out.println("the dog is eating the bone......");  
  8.  }  
  9.   
  10. }  

[java] view plaincopy
  1. package com.mediator.object;  
  2.   
  3. public class Sheep implements Animal {  
  4.   
  5.  @Override  
  6.  public void eat() {  
  7.   System.out.println("the sheep is eating the grass......");  
  8.  }  
  9.   
  10. }  

测试程序如下所示

[java] view plaincopy
  1. package com.mediator.test;  
  2.   
  3. import com.mediator.example.Mediator;  
  4. import com.mediator.example.MediatorImpl;  
  5.   
  6. public class Test {  
  7.  public static void main(String[] args) {  
  8.   Mediator m = new MediatorImpl();  
  9.   System.out.println("the result of bone:");  
  10.   m.notice("bone");  
  11.   
  12.   System.out.println("\n");  
  13.   System.out.println("the result of grass:");  
  14.   m.notice("grass");  
  15.  }  
  16. }  


运行结果如下所示:


the result of bone:
the dog is eating the bone......


the result of grass:
the sheep is eating the grass......


五:第二个样例

(1)Mediator 

[java] view plaincopy
  1. public abstract class Mediator {  
  2.  public abstract void notice(String content);  
  3. }  


(2) ConcreteMediator:  

[java] view plaincopy
  1. public class ConcreteMediator extends Mediator {  
  2.    private ColleagueA ca;  
  3.    private ColleagueB cb;  
  4.    public ConcreteMediator() {  
  5.        ca = new ColleagueA();  
  6.        cb = new ColleagueB();  
  7.    }  
  8.    public void notice(String content) {  
  9.       if(content.equals("boss")) {  
  10.          //老板来了,通知员工A  
  11.          ca.action();  
  12.       }  
  13.       if(content.equals("client")) {  
  14.          //客户来了,通知前台B  
  15.          cb.action();  
  16.       }  
  17.    }  
  18. }  

(3)ConcreteColleague 

public class ColleagueA extends Colleague {     public void action(){       System.out.println("老板来了,普通员工努力工作");     }  }  

public class ColleagueB extends Colleague {     public void action(){       System.out.println("前台员工注意,客户来了");     }  }  

测试:

[java] view plaincopy
  1. publci class Test{    
  2.    public static void main(String[] args){    
  3.      Mediator med = new ConcreteMediator();    
  4.      //老板来了    
  5.      med.notice("boss");    
  6.     //客户来了    
  7.     med.notice("client");    
  8.   }  
  9. }  

测试结果:

老板来了,普通员工努力工作

前台员工注意,客户来了

参考资料:

(1)http://rainbowj234.diandian.com/post/2011-11-18/6918862

(2)http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/30/2663922.html

(3)http://blog.csdn.net/chenming0733/article/details/7095709

原创粉丝点击