首页 > 其他分享 >行为型设计模式之中介者模式

行为型设计模式之中介者模式

时间:2022-09-28 20:31:33浏览次数:35  
标签:mediator void 同事 模式 协作 中介 设计模式 public

中介者模式

中介者模式又称为调解者模式或调停者模式,属于行为型模式。它用一个中介对象封装系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。其核心思想是,通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。

中介者模式通过提供一个中介类,将系统各层次对象间的多对多关系变成一对多关系,将复杂的网状结构变成以调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。

在这里插入图片描述

应用场景

当多个类相互耦合,形成了网状结构,则可以考虑使用中介者模式进行优化。

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

飞行器驾驶员之间不会通过相互沟通来决定下一架降落的飞机。 所有沟通都通过控制塔台进行。 在这里插入图片描述

主要角色

1.抽象中介者(Mediator)

定义统一的接口,用于各同事角色之间的通信

2.具体中介者(ConcreteMediator)

从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作

3.抽象同事类(Colleague)

每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交由中介者进行转发协作

4.具体同事类(ConcreteColleague)

负责实现自发行为(Self-Method),转发依赖方法

在这里插入图片描述

优缺点

优点:

1.减少类间依赖,将多对多依赖转化成了一对多,降低了类间耦合;

2.类间各司其职,符合迪米特法则。

缺点:

1.中介者模式中将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。

基本使用

创建抽象中介者

public abstract class Mediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

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

    public void setColleageB(ConcreteColleagueB colleague) {
        this.colleagueB = colleague;
    }

    // 中介者业务逻辑
    public abstract void transferA();

    public abstract void transferB();
}

创建具体中介者

public class ConcreteMediator extends Mediator {
    /**
     * 由具体同事类A,向具体同事对象B发出指令
     */
    @Override
    public void transferA() {
        this.colleagueB.selfMethodB();
    }

    /**
     * 由具体同事类B,向具体同事对象A发出指令
     */
    @Override
    public void transferB() {
        this.colleagueA.selfMethodA();
    }
}

创建抽象同事类

public abstract class Colleague {
    protected Mediator mediator;

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

创建具体同事类

public class ConcreteColleagueA extends Colleague {
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
        this.mediator.setColleageA(this);
    }

    /**
     * 自有方法
     */
    public void selfMethodA() {
        System.out.println( this.getClass().getSimpleName()+ "收到中介协作通知,selfMethodA自有方法执行");
    }

    /**
     * 依赖方法
     */
    public void depMethodA() {
        System.out.println( this.getClass().getSimpleName()+ " depMethodA通知中介者进行转发协作");
        // 中介者进行转发协作
        this.mediator.transferA();
    }
}
public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
        this.mediator.setColleageB(this);
    }

    /**
     * 自有方法
     */
    public void selfMethodB() {
        System.out.println(this.getClass().getSimpleName() + "收到中介协作通知,selfMethodB自有方法执行");
    }

    /**
     * 依赖方法
     */
    public void depMethodB() {
        System.out.println(this.getClass().getSimpleName() + " depMethodB通知中介者进行转发协作");
        // 中介者进行转发协作
        this.mediator.transferB();
    }
}

客户端执行

    public static void main(String[] args) {
        // 创建抽象中介者
        Mediator mediator = new ConcreteMediator();
        // 具体同事类
        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
        // 中介者进行转发协作,A转发给B
        colleagueA.depMethodA();
        System.out.println("-------------------------");
        // 中介者进行转发协作,B转发给A
        colleagueB.depMethodB();
    }
ConcreteColleagueA depMethodA通知中介者进行转发协作
ConcreteColleagueB收到中介协作通知,selfMethodB自有方法执行
-------------------------
ConcreteColleagueB depMethodB通知中介者进行转发协作
ConcreteColleagueA收到中介协作通知,selfMethodA自有方法执行

标签:mediator,void,同事,模式,协作,中介,设计模式,public
From: https://blog.51cto.com/chencoding/5720769

相关文章

  • 房产中介管理软件第10课:整合JWT
    一、引用Microsoft.AspNetCore.Authentication.JwtBearer二、在appsettings.json文件中新增关于jwt的设置//Jwt配置"JwtSettings":{//是否启用"IsEnable......
  • 化学吸附仪在各个模式下分别有哪些用途?
    化学吸附仪可进行脉冲化学吸附、程序升温还原(TPR)、程序升温氧化(TPO)和程序升温脱附(TPD),主要用于表征催化剂的表面活性位点及数量、强度、活性、稳定性、选择性和失活,对研究工......
  • 行为型设计模式之备忘录模式
    备忘录模式备忘录模式又称为快照模式或令牌模式,属于行为型模式。它是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象......
  • 设计模式 -- Singleton(单例模式)
    单例模式(Singleton)保证一个类仅有一个实例,并提供一个该实例的全局访问点。在软件系统中,经常有这样一个特殊的类,必须保证它们在系统中只存在一个示例,才能确保他们的逻辑......
  • 设计模式 -- Flyweight(享元模式)
    享元模式(Flyweight)运用共享技术有效地支持大量的细粒度对象在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行是代价——主......
  • 设计模式(一)
    1设计模式概述1.1设计模式的定义与分类设计模式的定义Designpatternsaredescriptionsofcommunicatingobjectsandclassesthatarecustomizedtosolvea......
  • 何增耀--数据模型通用模式讲座录像
    何增耀--数据模型通用模式时间:北京时间2017年2月28日(周二)晚上19:30-21:00演讲人: 何增耀,《数据模型资源手册(卷3)——数据模型通用模式》译者,现为ECPT产业互联网平台总架构师,......
  • Spring Resource和策略模式应用
    Spring把所有能记录信息的载体,如各种类型的文件、二进制流等都称为资源,对Spring开发者来说,最常用的资源就是Spring配置文件(通常是一份XML格式的文件)。在Sun所提供......
  • ThinkPHP6.0开启多应用模式的方法
    ThinkPHP发展至今已经到了6..0.X版本,整个结构较thinkphp5有了很大的变化,ThinkPHP6.0基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规......
  • 04-Go设计模式-抽象工厂方法模式
    抽象工厂方法模式代码/*抽象工厂方法模式从工厂方法模式可以看出来:(1)当添加一个新产品的时候,比如葡萄,虽然不用修改代码,但是需要添加大量的类,而且还需要添加相对的工厂......