JS设计模式之中介者模式

前言

中介者模式(Mediator Pattern)是一种行为设计模式,旨在通过引入一个中介者对象来减少多个对象之间的直接交互,降低对象之间的耦合度。

这种模式使得对象之间的通信通过中介者来协调,从而减少了对象之间的直接依赖。

主要组成部分

中介者模式包含以下几个核心组件:

  1. 中介者(Mediator):定义一个接口,该接口用于与各个具体同事对象进行交互,中介者负责管理这些同事对象之间的通信。

  2. 具体中介者(Concrete Mediator):实现中介者接口,维护对具体同事对象的引用,并实现协调它们之间交互的具体逻辑。

  3. 同事(Colleague):定义一个接口,表示参与交互的对象。每个同事对象都持有对中介者的引用,并通过中介者与其他同事对象进行交互。

  4. 具体同事(Concrete Colleague):实现同事接口,具体的同事对象通过中介者与其他同事对象进行通信。

工作原理

客户端创建一个具体中介者和多个同事对象。同事对象通过中介者进行交互,而不是直接引用其他同事对象。中介者协调同事对象之间的通信,处理它们之间的交互逻辑。

优点

  • 降低耦合度:通过中介者对象,减少了同事对象之间的直接依赖,使得系统更加灵活和可维护。
  • 集中控制:中介者集中管理同事对象之间的交互逻辑,便于修改和扩展。

缺点

  • 中介者复杂性:中介者可能会变得复杂,尤其是在同事对象较多时,可能导致中介者的职责过于繁重。

  • 不易扩展:如果需要添加新的同事对象,可能需要修改中介者的实现,增加了维护成本。

应用场景

中介者模式适用于多种场景,包括但不限于:

  1. GUI组件交互
  2. 聊天应用
  3. 订单处理系统
  4. 游戏开发
  5. 工作流管理
  6. 网络协议
  7. 多模块系统

示例

以下是中介者模式的一个简单实现示例,展示了如何通过中介者来协调两个对象之间的交互:

javascript 复制代码
// 中介者接口  
class Mediator {  
    notify(colleague, event) {}  
}  

// 具体中介者  
class ConcreteMediator extends Mediator {  
    constructor(colleague1, colleague2) {  
        super();  
        this.colleague1 = colleague1;  
        this.colleague1.setMediator(this);  
        this.colleague2 = colleague2;  
        this.colleague2.setMediator(this);  
    }  

    notify(colleague, event) {  
        if (event === 'A') {  
            console.log('Mediator reacts on A and triggers B');  
            this.colleague2.doSomethingB();  
        } else if (event === 'B') {  
            console.log('Mediator reacts on B and triggers A');  
            this.colleague1.doSomethingA();  
        }  
    }  
}  

// 同事接口  
class Colleague {  
    setMediator(mediator) {  
        this.mediator = mediator;  
    }  
}  

// 具体同事A  
class ConcreteColleagueA extends Colleague {  
    doSomethingA() {  
        console.log('Colleague A does something.');  
        this.mediator.notify(this, 'A');  
    }  
}  

// 具体同事B  
class ConcreteColleagueB extends Colleague {  
    doSomethingB() {  
        console.log('Colleague B does something.');  
        this.mediator.notify(this, 'B');  
    }  
}  

// 使用中介者模式  
const colleagueA = new ConcreteColleagueA();  
const colleagueB = new ConcreteColleagueB();  
const mediator = new ConcreteMediator(colleagueA, colleagueB);  

colleagueA.doSomethingA(); // Colleague A does something. Mediator reacts on A and triggers B  
colleagueB.doSomethingB(); // Colleague B does something. Mediator reacts on B and triggers A

总结

中介者模式提供了一种有效的方式来降低系统中对象之间的耦合度,通过集中管理对象间的交互逻辑,使得系统更加模块化和易于维护。

尽管在某些情况下,中介者可能会变得复杂,且不易扩展,但在需要减少对象间直接交互的场景中,中介者模式是一个非常有用的设计模式。

-- 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

相关推荐
搬砖的前端2 小时前
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
开发语言·javascript·uni-app
minstbe2 小时前
半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列
前端·javascript·数据库
江挽枫_Jangmiko3 小时前
JAVA课堂笔记24(反射+设计模式)
java·开发语言·笔记·设计模式
xue03054 小时前
react自定义hooks函数
javascript·react.js
前端熊猫4 小时前
组件十大传值
前端·javascript·vue.js
GISer_Jing5 小时前
React 工具和库面试题(一)
javascript·react.js·ecmascript
抓哇FullStack-Junior5 小时前
设计模式——原型模式
java·开发语言·设计模式·原型模式
oumae-kumiko5 小时前
【JS/TS鼠标气泡跟随】文本提示 / 操作提示
前端·javascript·typescript
YG·玉方5 小时前
键盘常见键的keyCode和对应的键名
前端·javascript·计算机外设