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.总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值