
Python 中介者模式讲解和代码示例
中介者是一种行为设计模式, 让程序组件通过特殊的中介者对象进行间接沟通, 达到减少组件之间依赖关系的目的。
中介者能使得程序更易于修改和扩展, 而且能更方便地对独立的组件进行复用, 因为它们不再依赖于很多其他的类。
复杂度:
流行度:
使用示例: 中介者模式在 Python 代码中最常用于帮助程序 GUI 组件之间的通信。 在 MVC 模式中, 控制器是中介者的同义词。
概念示例
本例说明了中介者设计模式的结构并重点回答了下面的问题:
- 它由哪些类组成?
- 这些类扮演了哪些角色?
- 模式中的各个元素会以何种方式相互关联?
main.py: 概念示例
from __future__ import annotations from abc import ABC class Mediator(ABC): """ The Mediator interface declares a method used by components to notify the mediator about various events. The Mediator may react to these events and pass the execution to other components. """ def notify(self, sender: object, event: str) -> None: pass class ConcreteMediator(Mediator): def __init__(self, component1: Component1, component2: Component2) -> None: self._component1 = component1 self._component1.mediator = self self._component2 = component2 self._component2.mediator = self def notify(self, sender: object, event: str) -> None: if event == "A": print("Mediator reacts on A and triggers following operations:") self._component2.do_c() elif event == "D": print("Mediator reacts on D and triggers following operations:") self._component1.do_b() self._component2.do_c() class BaseComponent: """ The Base Component provides the basic functionality of storing a mediator's instance inside component objects. """ def __init__(self, mediator: Mediator = None) -> None: self._mediator = mediator @property def mediator(self) -> Mediator: return self._mediator @mediator.setter def mediator(self, mediator: Mediator) -> None: self._mediator = mediator """ Concrete Components implement various functionality. They don't depend on other components. They also don't depend on any concrete mediator classes. """ class Component1(BaseComponent): def do_a(self) -> None: print("Component 1 does A.") self.mediator.notify(self, "A") def do_b(self) -> None: print("Component 1 does B.") self.mediator.notify(self, "B") class Component2(BaseComponent): def do_c(self) -> None: print("Component 2 does C.") self.mediator.notify(self, "C") def do_d(self) -> None: print("Component 2 does D.") self.mediator.notify(self, "D") if __name__ == "__main__": # The client code. c1 = Component1() c2 = Component2() mediator = ConcreteMediator(c1, c2) print("Client triggers operation A.") c1.do_a() print("\n", end="") print("Client triggers operation D.") c2.do_d()
Output.txt: 执行结果
Client triggers operation A. Component 1 does A. Mediator reacts on A and triggers following operations: Component 2 does C. Client triggers operation D. Component 2 does D. Mediator reacts on D and triggers following operations: Component 1 does B. Component 2 does C.