中介者模式Mediator

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

举例:在一个公司里面,有很多部门、员工,为了完成一定的任务,“同事”之间肯定有许多需要互相配合、交流的过程。如果由各个“同事”频繁地到处去与自己有关的“同事”沟通,这样肯定会形成一个多对多的杂乱的联系网络而造成工作效率低下。此时就需要一位专门的“中介者”给各个“同事”分配任务,以及统一跟进大家的进度并在“同事”之间实时地进行交互,保证“同事”之间必须的沟通交流。很明显我们知道此时的“中介者”担任了沟通“同事”彼此之间的重要角色了,“中介者”使得每个“同事”都变成一对一的联系方式,减轻了每个“同事”的负担,增强工作效率。

所以中介者模式适用场景:

1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。

中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。

package com.qinsoft.design;

import java.util.ArrayList;
import java.util.List;

/**
 * 中介者模式:行为型
 */
public class Mediator
{

    public static void main(String[] args)
    {
        Tertium mediator = new Tertium();

        Workman trac = new Workman("wesen",mediator);
        Workman mali = new Workman("mali",mediator);

        mediator.add(trac);
        mediator.add(mali);
        mediator.order("have a rest!");
        mediator.clear();

    }
}

class Workman
{
    private String name;
    private Tertium mediator;

    //构造函数必把把中介者注入
    public Workman(String name, Tertium mediator)
    {
        this.name = name;
        this.mediator = mediator;
    }

    //业务动作,相互通信息动作
    public void getOrder(String orders)
    {
        System.out.println(this.name + "," + orders);
    }
}

/**
 * 中介者
 */
class Tertium
{
    //提供参与者list,把参与通信的对象注册进来,注册动作也可放进参与者对象当中
    private List<Workman> works = new ArrayList<Workman>();

    public void add(Workman workman)
    {
        works.add(workman);
    }

    public void clear()
    {
        works.clear();
    }
    //统一通信动作通过中介
    public void order(String orders)
    {
        for(Workman m : works)
        {
            m.getOrder(orders);
        }
    }
}

在结构上,中介者模式与观察者模式、命令模式都添加了中间对象——只是中介者去掉了后两者在行为上的方向。因此中介者的应用可以仿照后两者的例子去写。但是观察者模式、命令模式中的观察者、命令都是被客户所知的,具体哪个观察者、命令的应用都是由客户来指定的;而大多中介者角色对于客户程序却是透明的。当然造成这种区别的原因是由于它们要达到的目的不同。

从目的上看,中介者模式与观察者模式、命令模式便没有了任何关系,倒是与外观模式有些相似。但是外观模式是介于客户程序与子系统之间的,而中介者模式是介于子系统与子系统之间的。这也注定了它们有很大的区别:外观模式是将原有的复杂逻辑提取到一个统一的接口,简化客户对逻辑的使用。它是被客户所感知的,而原有的复杂逻辑则被隐藏了起来。而中介者模式的加入并没有改变客户原有的使用习惯,它是隐藏在原有逻辑后面的,使得代码逻辑更加清晰可用。

原文地址:https://www.cnblogs.com/hnhcc39/p/2748410.html