当前位置:   article > 正文

设计模式:第四章 中介模式

中介模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1

1. 核心思想

由中介来承接房客与房东之间的交互过程,可以使得整个租房过程更加畅通、高效。这在程序中叫作中介模式,中介模式又称为调停模式。

在很多系统中,多个类很容易相互耦合,形成网状结构。中介模式的作用就是将这种网状结构分离成星型结构。经过这样的调整后,对象之间的结构更加简洁,交互更加顺畅。

网状和星型结构

2. UML类图

中介者模式UML类图

3. 代码框架

from abc import ABC, abstractmethod
import sys
from typing import Any

class InteractiveObject(ABC):
    def __init__(self, mediator) -> None:
        self._mediator = mediator

class InteracivaObjectImplA(InteractiveObject):
    def send(self, message:Any):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")
        print("----{} send message:'{}' to {}".format(self.__class__.__name__, message, self._mediator.__class__.__name__))
        self._mediator.send(message, self)
    
    def notify(self, message):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")
        print("----{} received mesage:'{}'".format(self.__class__.__name__, message))

class InteracivaObjectImplB(InteractiveObject):
    def send(self, message:Any):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")
        print("----{} send message:'{}' to {}".format(self.__class__.__name__, message, self._mediator.__class__.__name__))
        self._mediator.send(message, self)
    
    def notify(self, message):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")
        print("----{} received mesage:'{}'".format(self.__class__.__name__, message))

class AbstractMediator(ABC):
    @abstractmethod
    def send(self, message:Any, interactivObject: InteractiveObject):
        pass

class Mediator(AbstractMediator):
    def setInteractiveObjectImplA(self, interactiveObjectImplA):
        self.interactiveObjectImplA = interacivaObjectImplA

    def setInteractiveObjectImplB(self, interactiveObjectImplB):
        self.interactiveObjectImplB = interacivaObjectImplB

    def send(self, message: Any, interactiveObject: InteractiveObject):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")
        if interactiveObject ==self.interactiveObjectImplA:
            print("----{} receive message:'{}' from {} and send to {}".format(self.__class__.__name__, message, interactiveObject.__class__.__name__, self.interactiveObjectImplB.__class__.__name__))
            self.interactiveObjectImplB.notify(message)
        else:
            print("----{} receive message:'{}' from {} and send to {}".format(self.__class__.__name__, message, interactiveObject.__class__.__name__, self.interactiveObjectImplA.__class__.__name__))
            self.interactiveObjectImplA.notify(message)

if __name__ == "__main__":
    mediator = Mediator()
    # 交互对象认识中介对象
    interacivaObjectImplA=InteracivaObjectImplA(mediator)
    interacivaObjectImplB=InteracivaObjectImplB(mediator)
    # 中介对象认识每个交互对象
    mediator.setInteractiveObjectImplA(interacivaObjectImplA)
    mediator.setInteractiveObjectImplB(interacivaObjectImplB)
    # 交互对象A和交互对象B通过中介对象交流
    interacivaObjectImplA.send("Have you eaten dinner?")
    interacivaObjectImplB.send("Not yet, do you want to invite me?")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

4. 模型说明

4.1 设计要点

中介模式主要有以下三个角色,在设计中介模式时要找到并区分这些角色:

  1. 交互对象(InteractiveObject):要进行交互的一系列对象。
  2. 中介者(Mediator):负责协调各个对象之间的交互。
  3. 具体中介者(Mediator):中介的具体实现。

4.2 优缺点

  1. 优点

    • Mediator将原本分布于多个对象间的行为集中在一起,作为一个独立的概念并将其封装在一个对象中,简化了对象之间的交互。
    • 将多个调用者与多个实现者之间多对多的交互关系,转换为一对多的交互关系,一对多的交互关系更易于理解、维护和扩展,大大减少了多个对象之间相互交叉引用的情况。
  2. 缺点

    • 中介者承接了所有的交互逻辑,交互的复杂度转变成了中介者的复杂度,中介者类会变得越来越庞大和复杂,以至于难以维护。
    • 中介者出问题会导致多个使用者同时出问题。

5. 应用场景

  1. 一组对象以定义良好但复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  3. 想通过一个中间类来封装多个类中的行为,同时又不想生成太多的子类。

[1]程杰.大话数据模式[M].北京:清华大学出版社,2007.
[2]罗伟富.人人都懂设计模式:从生活中领悟设计模式:Python实现[M].北京:电子工业出版社,2019.


  1. 本文为书籍《大话数据模式》和《人人都懂设计模式:从生活中领悟设计模式:Python实现》阅读笔记 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/181107
推荐阅读
相关标签
  

闽ICP备14008679号