《设计模式入门》 23.中介者模式

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

我们接触最多的情况就比如是在ORM框架中,中间层负责了应用层与数据库层的交互,将应用层与数据库层解耦,比如mybaties的应用。

中介者模式一般分类四类:

  1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互

=========================================================================

我们来简单的使用中介者模式来模拟联合国作为中介,调停俄罗斯和乌克兰的冲突:

首先定义一个抽象中介者:

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName Mediator.java
 * @Description 抽象中介者
 * @createTime 2022年03月18日 15:32:00
 */
public abstract class Mediator {
    /**
     * 交流方法
     * @param message 交流信息
     * @param country 国家
     */
    public abstract void declare(String message, Country country);
}

然后定义一个国家类,并申明中介者:

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName Country.java
 * @Description 国家类
 * @createTime 2022年03月18日 15:35:00
 */
public class Country {
    /**
     * 中介者
     */
    protected Mediator mediator;

    public Country(Mediator mediator){
        this.mediator = mediator;
    }
}

创建俄罗斯和乌克兰集成国家类:

俄罗斯:

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName Russia.java
 * @Description 俄罗斯
 * @createTime 2022年03月18日 15:37:00
 */
public class Russia extends Country{
    public Russia(Mediator mediator) {
        super(mediator);
    }

    /**
     * 交流方法
     * @param message 消息
     */
    public void declare(String message){
        mediator.declare(message,this);
    }

    /**
     * 获取消息
     * @param message 其他国家传来的消息
     */
    public void getMessage(String message){
        System.out.println("俄罗斯获得消息: "+message);
    }
}

乌克兰:

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName Ukraine.java
 * @Description TODO
 * @createTime 2022年03月18日 15:41:00
 */
public class Ukraine extends Country{
    public Ukraine(Mediator mediator) {
        super(mediator);
    }
    /**
     * 交流方法
     * @param message 消息
     */
    public void declare(String message){
        mediator.declare(message,this);
    }

    /**
     * 获取消息
     * @param message 其他国家传来的消息
     */
    public void getMessage(String message){
        System.out.println("乌克兰获得消息: "+message);
    }
}

创建一个中介者:联合国

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName TheUnitedNations.java
 * @Description 联合国
 * @createTime 2022年03月18日 15:42:00
 */
public class TheUnitedNations extends Mediator{
    private Russia russia;
    private Ukraine ukraine;

    public void setRussia(Russia russia) {
        this.russia = russia;
    }

    public void setUkraine(Ukraine ukraine) {
        this.ukraine = ukraine;
    }

    @Override
    public void declare(String message, Country country) {
        if (country == russia){
            ukraine.getMessage(message);
        }else {
            russia.getMessage(message);
        }
    }
}

联合国实现了乌克兰的俄罗斯的沟通,并且解耦了两个类。

 测试一下 :

package BehavioralPatterns.MediatorPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName MediatorTest.java
 * @Description TODO
 * @createTime 2022年03月18日 15:44:00
 */
public class MediatorTest {
    public static void main(String[] args) {
        TheUnitedNations unitedNations = new TheUnitedNations();

        Russia russia = new Russia(unitedNations);
        Ukraine ukraine = new Ukraine(unitedNations);

        unitedNations.setRussia(russia);
        unitedNations.setUkraine(ukraine);

        russia.declare("放弃基辅,赶快投降");
        ukraine.declare("北约爸爸们会救我的");
    }
}

 

优点:

  • 降低了对象之间的耦合性,使得对象易于独立地被复用。
  • 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点:

  • 当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PigeonEssence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值