中介者模式

来源:互联网 发布:dnf异次元碎片 淘宝 编辑:程序博客网 时间:2024/05/12 10:13

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
 
通用类图:
 
        举例:在一个公司里面,有很多部门、员工(我们统称他们互相为Colleague“同事”),为了完成一定的任务,“同事”之间肯定有许多需要互相配合、交流的过程。如果由各个“同事”频繁地到处去与自己有关的“同事”沟通,这样肯定会形成一个多对多的杂乱的联系网络而造成工作效率低下。
 
        此时就需要一位专门的“中介者”给各个“同事”分配任务,以及统一跟进大家的进度并在“同事”之间实时地进行交互,保证“同事”之间必须的沟通交流。很明显我们知道此时的“中介者”担任了沟通“同事”彼此之间的重要角色了,“中介者”使得每个“同事”都变成一对一的联系方式,减轻了每个“同事”的负担,增强工作效率。
 
        大概理清上面简单例子中的意图之后,给出中介者模式适用场景:
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
 
        其实,中介者模式又被称为“调停者”模式,我们可以理解为一群小孩子(同事)吵架了,这时就很需要一位大人(调停者)过来处理好小孩子们的关系,以免发生不必要的冲突。“中介者”和“调停者”只不过是同一个英语单词“Mediator”的不同翻译罢了。反正最最重要的是:中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。

/*
* 中介者模式意图:用一个中介者对象将一些列对象交互封装,从而降低这些对象间的耦合性并且可以独立地改变对象间的交互关系。
*
* 中介者模式实现要点:1、添加中间对象(中介者)对需要交互的对象的行为进行管理
* 2、通过中介方法,实现对象间的交互,从而实现对象间交互的松散耦合。
*
* 中介者模式优点:1、通过中介模式可以降低对象间的耦合关系
* 2、可以方便的改变对象间的交互方式和关系
* 3、通过集中控制可以增加代码的复用,如若两个对象需要通过一定特殊的方式通信,可以将其通信方式添加中介中,可以减小对象间对通信方式依赖
*
* 中介者模式缺点:1、通过集中控制的方法,有可能增加代码的发杂性和阅读难度
* 2、中介者模式可能对系统产生性能上的影响,因为所有的通信都是通过中介来通信。
*
* 中介者模式适用场景:1、应用于一组对象以定义良好但是复杂的方法进行通信的场合
* 2、想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。
*/

package Mediator;
/// <summary>
/// 抽象同事类
/// </summary>
abstract class Colleague
{
  protected Mediator mediator;
  public Colleague(Mediator mediator)
  {
      this.mediator = mediator;
  }
}
/// <summary>
/// 抽象中介者类
/// </summary>
abstract class Mediator
{
  /// <summary>
  /// 定义抽象的发送消息方法,得到同事对象和发送消息
  /// </summary>
  public abstract void Send(String message, Colleague colleague);
}
/// <summary>
/// 具体中介者类
/// </summary>
class ConcreteMediator extends Mediator
{
    public ConcreteColleague1 Colleague1;
    public ConcreteColleague2 Colleague2;
    /// <summary>
    /// 重写发送方法,根据不同同事做出选择
    /// </summary>
    @Override
    public void Send(String message, Colleague colleague){
        if (colleague == this.Colleague1)
        {
            this.Colleague2.Notify(message);
        }
        else
        {
            this.Colleague1.Notify(message);
        }
    }
 
}
/// <summary>
/// 具体同事
/// </summary>
class ConcreteColleague1 extends Colleague
{
    public ConcreteColleague1(Mediator mediator){
     super(mediator);
    }
    public void Send(String message)
    {
        mediator.Send(message, this);
    }
    public void Notify(String message)
    {
        System.out.println("同事1得到信息:" + message);
    }
}
/// <summary>
/// 具体同事
/// </summary>
class ConcreteColleague2 extends Colleague
{
    public ConcreteColleague2(Mediator mediator){
     super(mediator);
    }
    public void Send(String message){
        mediator.Send(message, this);
    }
    public void Notify(String message){
        System.out.println("同事2得到信息:" + message);
    }
}


public class MediatorTest {
 public static void main(String[] args)
    {
        ConcreteMediator m = new ConcreteMediator();
        //让同事认识中介者对象
        ConcreteColleague1 c1 = new ConcreteColleague1(m);
        ConcreteColleague2 c2 = new ConcreteColleague2(m);
        //让中介者认识具体对象
        m.Colleague1 = c1;
        m.Colleague2 = c2;
        //具体发送的消息都是通过中介者转发
        c1.Send("吃饭了吗");
        c2.Send("你请客?");
    }
}

 

转载:http://blog.sina.com.cn/s/blog_567100f90100mzgi.html

原创粉丝点击