设计模式-中介者模式

1、概述

中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

角色

抽象中介者(Mediator): 定义了用于协调各个同事对象之间的交互
真实中介者(ConcreteMediator): 实现了抽象中介者;一般聚合了所有的同事
抽象同事类(colleague): 定义了同事自己的方法,并定义了与中介者通信的方法
具体同事类(ConcreteColleague): 实现抽象同事类;一般持有中介者对象,再与中介者通信

2、优缺点

优点

多个类相互耦合,会形成网状结构(通信路线很多),使用中介者模式将网状结构分离为星型结构进行解耦
减少类间依赖,峰低了耦合,符合迪米特原则
如果出现了Bug,比较容易定位Bug的位置
ConcreteColleague容易复用(如果需要写一个新的对话框,那么按钮、文本输入框都可以很容易使用到新的对话框中)

缺点

中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意
ConcreteMediator难以复用,因为其依赖于特定的应用程序

3、实现方式



public class Test {

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

        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        colleague1.send("Nice to meet u.");
        colleague2.send("Nice to meet u too.");
    }

}

public abstract class Mediator {
    //抽象的发送消息方法
    public abstract void send(String message, Colleague colleague);
}

public abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

public class ConcreteMediator extends Mediator {

    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public void setColleague1(ConcreteColleague1 colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(ConcreteColleague2 colleague2) {
        this.colleague2 = colleague2;
    }

    @Override
    public void send(String message, Colleague colleague) {
        if(colleague == colleague1) {
            colleague2.notify(message);
        } else {
            colleague1.notify(message);
        }
    }

}

public 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);
    }

}

public 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);
    }

}

4、应用场景

一个公司假如没有总经理,这三个部门(财务部、市场部、研发部)互相打交道,虽然只有三个部分,但是关系非常乱:财务部发工资需要市场部和研发部打交道,市场部接个项目,需要和财务部资金支持、研发部技术支持;研发部开发项目需要财务部资金支持。
实际上,公司都有总经理。各个部门有什么事情都报到总经理这里,总经理再通知各个相关部分。
这就是一个典型的中介者模式,总经理起到一个中介、协调的作用。

This entry was posted in 应用, 设计模式. Bookmark the permalink.