努力保头发的打工人
努力保头发的打工人
发布于 2021-01-24 / 27 阅读 / 0 评论 / 0 点赞

中介者模式

1.概述

定义为,用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。通用类图如下:

中介者模式类图.png

中介者模式有以下模块组成:

  • Mediator 抽象中介者

  • ConcreteMediator具体中介者

  • Colleague同事类

2.优缺点

中介者优点就是减少了类间的依赖,把原来同事类之间的相互依赖变成了每个同事类只是依赖中介者,降低了类间的耦合。

缺点就是随着业务的增多中介者会变得越来越大,越来越复杂。

3.实际应用

中介者模式也叫作调停者模式,一个对象和多个对象交流,自己作为中心,来负责多个类之间的交流。

  • 机场调度中心:飞机、跑道、航线之间调度

  • mcv框架:controller将model和view隔离开

  • 媒体网关:用户之间的消息经过MSN服务器中转

  • 中介服务:各种房屋中介,不用一个一个小区找,找中介,具体交个中介去处理,房东也只和中介沟通就行了。

4.代码示例

创建中介者抽象类,它依赖同事类

/**
 * @author chiangtaol
 * @date 2020-12-02
 * @describe 抽象中介者
 */
@Data
public abstract class MediatorAbstract {
​
    protected ConcreteColleague1 colleague1;
    protected ConcreteColleague2 colleague2;
​
    public MediatorAbstract(){
        this.colleague1 = new ConcreteColleague1(this);
        this.colleague2 = new ConcreteColleague2(this);
    }
​
    // 中介者能做的事情
    public abstract void doSomething1();
    public abstract void doSomething2();
}

创建具体的中介,一般只有一个中介者实现类,由一个中介实现所有抽象方法。

/**
 * @author chiangtaol
 * @date 2020-12-02
 * @describe 具体中介者
 */
public class ConcreteMediator extends MediatorAbstract{
    @Override
    public void doSomething1() {
        // 可用调用同事的方法
        super.colleague1.selfMethod1();
        super.colleague2.selfMethod2();
    }
​
    @Override
    public void doSomething2() {
        System.out.println("这是同事单独做不到的事情,这里可以调用到所有同事public方法,省去了同事间的相互调用");
    }
}

创建同事的抽象类,规定构造方法参数必须传入一个中介者

/**
 * @author chiangtaol
 * @date 2020-12-02
 * @describe 同事抽象类
 */
public abstract class ColleagueAbstract {
​
    protected MediatorAbstract mediatorAbstract;
​
    public ColleagueAbstract(MediatorAbstract mediator){
        this.mediatorAbstract = mediator;
    }
}

创建具体的同事类,每个类都有自己能做到的事情,不能做到的事交个中介去做,中介依赖了其他同事类,每个同事只需依赖中介就行了,具体实现在具体中介类中完成。

/**
 * @author chiangtaol
 * @date 2020-12-02
 * @describe 具体同事类, 有特定职能
 */
public class ConcreteColleague1 extends ColleagueAbstract{
​
    // 通过构造方法传递中介类
    public ConcreteColleague1(MediatorAbstract mediator) {
        super(mediator);
    }
​
    /**
     * 自己能做的事情
     */
    public void selfMethod1(){
        System.out.println("这是同事1能做到的事情");
    }
​
    /**
     * 自己做不到的事情,需要委托中介办理
     */
    public void depMethod1(){
        super.mediatorAbstract.doSomething1();
    }
}
/**
 * @author chiangtaol
 * @date 2020-12-02
 * @describe 同事类
 */
public class ConcreteColleague2 extends ColleagueAbstract{
​
    // 通过构造方法传递中介
    public ConcreteColleague2(MediatorAbstract mediator) {
        super(mediator);
    }
​
    /**
     * 自己能做的事情
     */
    public void selfMethod2(){
        System.out.println("这是同事2能做到的事情");
    }
​
    /**
     * 自己做不到的事情,需要委托中介办理
     */
    public void depMethod2(){
        super.mediatorAbstract.doSomething2();
    }
}
class ConcreteMediatorTest {
​
    @Test
    public void test() throws Exception{
        // 中介者
        ConcreteMediator mediator = new ConcreteMediator();
​
        // 同事1
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        // 调用自己能做到的
        colleague1.selfMethod1();
        System.out.println("------------------------");
        // 委托中介去办,调用自己和同事2能办的事情
        colleague1.depMethod1();
​
        System.out.println("------------------------");
​
        // 同事2
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
        // 调用自己的方法
        colleague2.selfMethod2();
        System.out.println("------------------------");
        // 委托中介去办的事情
        colleague2.depMethod2();
​
    }
}
​
这是同事1能做到的事情
------------------------
这是同事1能做到的事情
这是同事2能做到的事情
------------------------
这是同事2能做到的事情
------------------------
这是同事单独做不到的事情,这里可以调用到所有同事public方法,省去了同事间的相互调用