三、中介者模式(迪米特法则)
概念
模式动机:
为了减少对象两之间复杂的引用关系,使之成为一个松耦合的系统,需要适用中介者模式
定义:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使耦合松散,而且可以独立地该变它们之间的交互
中介者模式又称为调停者模式,它是一种对象行为型模式
中介者模式的要点是将所有对象之间的交互细节抽象到一个独立的类中,这个类叫做中介者类Mediator
类图
代码
中介者模式(Mediator Pattern)是一种软件设计模式,它通过将对象之间的交互行为封装在一个中介者对象中,来实现对象之间的解耦。中介者模式促进了对象之间的松耦合,使其更易于维护和扩展。
下面是一个简单的中介者模式的代码示例,以说明其工作原理:
class Mediator:
def __init__(self):
self.component1 = Component1(self)
self.component2 = Component2(self)
def notify(self, sender, event):
if event == 'event1':
self.component2.do_something()
elif event == 'event2':
self.component1.do_something()
class Component1:
def __init__(self, mediator):
self.mediator = mediator
def do_something(self):
# 处理自己的逻辑
print("Component 1 does something.")
# 触发事件通知中介者
self.mediator.notify(self, 'event1')
class Component2:
def __init__(self, mediator):
self.mediator = mediator
def do_something(self):
# 处理自己的逻辑
print("Component 2 does something.")
# 触发事件通知中介者
self.mediator.notify(self, 'event2')
# 创建中介者对象
mediator = Mediator()
# 执行操作
component1 = Component1(mediator)
component2 = Component2(mediator)
component1.do_something()
在上述代码示例中,我们有一个中介者类 Mediator
和两个组件类 Component1
和 Component2
。中介者类拥有对这两个组件的引用,并提供了一个 notify
方法用于接收事件通知并根据不同的事件执行相应的操作。
当组件 Component1
执行 do_something
方法时,它会触发事件通知中介者,中介者根据事件类型调用 Component2
的相应方法。同样地,当组件 Component2
执行 do_something
方法时,它也会触发事件通知中介者,中介者根据事件类型调用 Component1
的相应方法。
这样,组件之间的交互行为通过中介者对象进行了封装,组件之间的耦合度降低,它们只需要与中介者进行通信,而不需要直接相互交互。这种解耦有助于增强代码的可维护性和扩展性。
中介者模式在现实世界中有许多应用,比如聊天室、航空交通管制系统等,它们都使用中介者来协调不同对象之间的交互行为,从而实现更好的系统设计。
中介者承担两方面的职责
中转作用(结构性):
通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。
该中转作用属于中介者在结构上的支持。
协调作用(行为性):
中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。
该协调作用属于中介者在行为上的支持。
实例一:旅游项目信息共享软件的设计
实例二:海岛微型飞机场
优缺点
优点:
缺点:
在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护
适用场合
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类
中介者模式与迪米特法则
在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代。因此,中介者模式就是迪米特法则的一个典型应用。
课程作业