16.行为型 - 中介者模式 (Mediator)

1.定义

  • 将对象之间的n:m关系,转换为中介者与其他对象的1:n关系,达到松散耦合的目的
  • 中介者需要知道每个Colleague对象,每个Colleague对象也需要直到中介,Colleague对象通过中介者交互数据

2.UML类图

在这里插入图片描述

  • 角色介绍
    AbstractMediator : 抽象中介者,定义传递同事对象到中介的接口
    ConcreteMediator : 具体中介者,传递同事对象之间的数据
    AbstractColleague : 抽象同事类,只与中介进行交互,不知道其他同事对象
    ConcreteColleagueA : 具体同事类
    ConcreteColleagueB : 具体同事类
  • 要点
    抽象中介者、抽象同事 两者我中有你,你中有我,达到互相通信的目的。
    同事只与中介交换数据,不知道其他同事类的存在。

3.UML示例代码

/**
 * Copyright (C), 2015-2019
 * FileName: AbstractMediator
 * Author: wei.zheng
 * Date: 2019/10/25 22:17
 * Description: 抽象中介者, 持有具体同事的引用
 */
public abstract class AbstractMediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

    public abstract void method();

    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
}
/**
 * Copyright (C), 2015-2019
 * FileName: ConcreteMediator
 * Author: wei.zheng
 * Date: 2019/10/25 22:22
 * Description: 具体中介者
 */
public class ConcreteMediator extends AbstractMediator {

    @Override
    public void method() {
        colleagueA.action();
        colleagueB.action();
    }
}
/**
 * Copyright (C), 2015-2019
 * FileName: AbstractColleague
 * Author: wei.zheng
 * Date: 2019/10/25 22:18
 * Description: 抽象同事类,持有中介对象的引用,可以调用中介对象的方法,达到通知中介者的目的
 */
public abstract class AbstractColleague {
    protected AbstractMediator mediator;

    public AbstractColleague(AbstractMediator mediator){
        this.mediator = mediator;
    }

    public abstract void action();
}

/**
 * Copyright (C), 2015-2019
 * FileName: ConcreteColleagueA
 * Author: wei.zheng
 * Date: 2019/10/25 22:19
 * Description: 具体同事A
 */
public class ConcreteColleagueA extends AbstractColleague {

    public ConcreteColleagueA(AbstractMediator mediator) {
        super(mediator);
    }

    @Override
    public void action() {
        System.out.println("ColleagueA 将信息交给中介者处理");
    }
}
/**
 * Copyright (C), 2015-2019
 * FileName: ConcreteColleagueB
 * Author: wei.zheng
 * Date: 2019/10/25 22:21
 * Description: 具体同事B
 */
public class ConcreteColleagueB extends AbstractColleague {

    public ConcreteColleagueB(AbstractMediator mediator) {
        super(mediator);
    }

    @Override
    public void action() {
        System.out.println("ColleagueB 将信息交给中介者处理");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: Client
 * Author: wei.zheng
 * Date: 2019/12/24 9:36
 * Description: 中介者模式用户类
 */
public class Client {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

        mediator.setColleagueA(colleagueA);
        mediator.setColleagueB(colleagueB);

        mediator.method();
    }
}
// 运行结果
2019-12-24 09:41:29.917 22610-22610/? I/System.out: ColleagueA 将信息交给中介者处理
2019-12-24 09:41:29.918 22610-22610/? I/System.out: ColleagueB 将信息交给中介者处理

4.总结

中介者模式,将同事对象之间的网型结构,转换为以中介为中心的星型结构。
优点:对复杂依赖关系进行解耦,使逻辑结构清晰
缺点:类的膨胀在此模式表现的并不明显,只增加了中介者。
      权衡利弊,若依赖关系很简单,则无需使用此模式,避免使简单问题复杂化。

发布了37 篇原创文章 · 获赞 0 · 访问量 566

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103677800