设计模式篇---中介者模式

文章目录

概念

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

就好比世界各个国家之间可能会产生冲突,但是当产生冲突的时候需要联合国来解决冲突。每个国家之间的关系,就好比对象和对象之间的关系,这就需要每个对象知道其他的所有对象,具有很强的耦合性。但是每个国家只需要关联联合国这个对象的话,耦合性就会降低很多。

结构


Mediator (抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。
ConcreteMediator (具体中介者):抽象中介者的子类,协调各个同事对象来实现写作关系,它维持了对各个不同同事对象的引用。
Colleague (抽象同事类):它定义公有的方法,它维持了一个对抽象中介者类的引用。
ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事之间需要通信时需要先与中介者通信,通过中介者再实现其他同事之间的通信。

实例

现在以美国和伊拉克之间的战争为例,联合国作为中介者,用中介者模式来实现这个demo。

联合国机构类

java 复制代码
public abstract class UnitedNations {
    public abstract void declare(String message, Country colleague);
}

联合国安全理事会

java 复制代码
@Data
public class UnitedNationsSecurityCouncil extends UnitedNations {

    private USA usa;
    private Iraq iraq;

    @Override
    public void declare(String message, Country colleague) {
        if (colleague == usa) {
            iraq.getMessage(message);
        } else {
            usa.getMessage(message);
        }

    }
}

国家类

java 复制代码
public abstract class Country {
    protected UnitedNations mediator;

    protected Country(UnitedNations mediator) {
        this.mediator = mediator;
    }

    public abstract void declare(String message);

    public abstract void getMessage(String message);

}

美国类

java 复制代码
public class USA extends Country {

    public USA(UnitedNations mediator) {
        super(mediator);
    }

    @Override
    public void declare(String message) {
        super.mediator.declare(message, this);
    }

    @Override
    public void getMessage(String message) {
        System.out.println("美国获得对方信息:" + message);
    }
}

伊拉克类

java 复制代码
public class Iraq extends Country {

    public Iraq(UnitedNations mediator) {
        super(mediator);
    }
    
    @Override
    public void declare(String message) {
        super.mediator.declare(message, this);
    }

    @Override
    public void getMessage(String message) {
        System.out.println("伊拉克获得对方信息:" + message);
    }
}

客户端

java 复制代码
public class Client {

    public static void main(String[] args) {
        UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil();

        USA c1 = new USA(unsc);
        Iraq c2 = new Iraq(unsc);

        unsc.setUsa(c1);
        unsc.setIraq(c2);
        
        c1.declare("不准研制核武器,否则要发动战争!");
        c2.declare("我们没有核武器,也不怕侵略。");
    }
}

打印结果:

总结

中介者模式将一个网状的系统结构变成了一个以中介者对象为中心的星型结构,也是一个"迪米特法则"应用的标准模式,各个对象之间不需要耦合,它们之间的沟通仅需要中介者即可。但因为中介者本身需要关联大量的对象,导致后续的维护比较困难。因此也可以做一个小个改善,将变的地方放到配置中进行维护。

java 复制代码
public class UnitedNationsSecurityCouncil extends UnitedNations {
    //放到配置中心
    private List<Country> countryList = new ArrayList<>();

    @PostConstruct
    public void init() {
        countryList=Congfiguration.getCountryList();
    }


    @Override
    public void declare(String message, Country colleague) {
      
        countryList.forEach(country -> {
            if (country.getClass() == colleague.getClass()) {
                country.getMessage(message);
            }
        });
    }
}
相关推荐
晨米酱10 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机15 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机16 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤17 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式