Skip to content

中介者模式(调停者模式)

ZHI-XINHUA edited this page Jan 11, 2019 · 1 revision

调停者模式(Mediator)

调停者模式又叫中介者模式,它是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明细引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发送改变时,不会立刻影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地编号。 遵循:迪米特法则

1、调停者模式结构

角色:

  • 抽象同事类角色(Colleague):定义调停者到同事对象的接口。同事对象只知道调停者而不知道其它同事对象。
  • 具体同事类角色(ConcreteColleague):实现同事类接口,实现自己行为
  • 抽象调停者角色(Mediator):定义出同事对象到调停者对象的接口
  • 具体调停者角色(ConcreteMediator):实现调停者的行为。具体调停者知晓所有具体同事对象。 它从具体同事对象接受消息、向具体同事对象发出指令。

2、举例说明

没有WTO时,世界贸易是这样的:

WTO成立之后,使得各个贸易地区之间的强大关联转换成松散的耦合关系,如下图

所以,在这个例子中,WTO就是起到一个调停者的角色。

3、demo

公司里面财务部和市场部不直接打交道,通过总经理协调它们日常的工作。总经理就是调停者。

uml如下:

(1)定义部门接口并定义其行为(抽象同事类角色)

/**
 * 部门接口
 * 抽象同事类角色:定义调停者到同事对象的接口。同事对象只知道调停者而不知道其它同事对象
 */
public interface Department {

    /**
     * 自己部门处理的事情
     */
    void myAction();

    /**
     * 向领导汇报的事情
     */
    void outAction();
}

(2)财务部、市场部 它们之间没有直接的关联,但是可以直接和总经理打交道(即都持有总经理的引用)

/**
 * 财务部
 * 具体同事类角色:实现同事类接口,实现自己行为
 */
public class Finacial implements Department {
    //持有调停者(总经理)的引用
    private ExecutiveLeader leader;

    public Finacial(ExecutiveLeader leader){
        this.leader = leader;
        leader.register("finacial",this);
    }

    @Override
    public void myAction() {
        System.out.println("财务部:数钱,清点资金....");
    }

    @Override
    public void outAction() {
        System.out.println("财务部:经过一番努力,资金已经准备好!");
    }
}
/**
 * 市场部
 * 具体同事类角色:实现同事类接口,实现自己行为
 */
public class Market implements Department {
    // 持有调停者(总经理)的引用
    private ExecutiveLeader leader;

    public Market(ExecutiveLeader leader){
        leader = leader;
        leader.register("market",this);
    }

    @Override
    public void myAction() {
        System.out.println("市场部:筹备市场推广中。");
    }

    @Override
    public void outAction() {
        System.out.println("市场部:申请经费:需要资金市场搞推广活动。");
    }
}

(3) 领导接口,具有管理部门的行为

/**
 *  行政领导接口
 *  抽象调停者角色:定义出同事对象到调停者对象的接口
 */
public interface ExecutiveLeader {
    /**
     * 组织架构,管理协调部门
     * @param dname
     * @param d
     */
    void register(String dname,Department d);

    /**
     * 指示命令
     * @param dname
     */
    void command(String dname);
}

(4)总经理(具体调停者角色),协调各个部门日常工作

/**
 * 总经理
 * 具体调停者角色:实现调停者的行为。具体调停者知晓所有具体同事对象。 它从具体同事对象接受消息、向具体同事对象发出指令。
 */
public class GeneralManager implements ExecutiveLeader {

    //存放组织架构的管理信息 ,管理部门
    private Map<String,Department> map = new HashMap<String , Department>();

    // 总经理管理部门
    @Override
    public void register(String dname, Department d) {
        map.put(dname,d);
    }

    //总经理指示部门干事
    @Override
    public void command(String dname) {
        System.out.println("总经理:已阅,下面部门尽快解决");
        map.get(dname).myAction();
    }
}

测试

public static void main(String[] args) {
    //总经理,调停者角色
    ExecutiveLeader leader = new GeneralManager();
    //市场部
    Market market = new Market(leader);
    //财务部
    Finacial finacial = new Finacial(leader);

    market.myAction();//市场部内部事情
    market.outAction();//市场部需要财务部协助,向总经理申请

    leader.command("finacial");//总经理发出指令,财务部干事

}
市场部:筹备市场推广中。
市场部:申请经费:需要资金市场搞推广活动。
总经理:已阅,下面部门尽快解决
财务部:数钱,清点资金....

4、开发中常见的场景:

  • MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交道)

  • Java.lang.reflect.Method#invoke()