目录
一、Python中介者模式介绍
Python中介者模式是一种行为型设计模式,它允许多个对象之间进行通信而不必直接相互引用。在这种模式中,一个中介者对象控制多个对象之间的通信,从而减少对象之间的耦合度。
功能:
- 将对象间的复杂关系转换为中介者与对象之间的简单关系;
- 降低系统的耦合度,使得对象之间可以独立地变化;
- 促进对象之间的协作和沟通,提高系统的可维护性和可扩展性。
优点:
- 可以降低对象之间的耦合度,减少代码重复;
- 可以实现对象间的松耦合,使得系统的扩展和维护更加容易;
- 可以提高系统的灵活性,使得系统更易于协作和沟通。
缺点:
- 中介者对象可能会变得复杂,难以维护;
- 中介者模式可能会导致系统性能降低,因为对象之间的通信需要通过中介者对象传递。
应用场景:
- 对象之间的交互比较复杂,且难以维护;
- 对象之间的耦合度比较高,难以实现对象的松耦合;
- 对象之间的通信需要通过一个中介者进行协调和控制。
使用方式:
- 定义中介者接口:定义中介者类,包含用于协调和控制对象之间通信的方法;
- 定义抽象对象类:定义抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
- 实现具体对象类:实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
- 构建中介者对象:构建中介者对象,并在其中保存所有的抽象对象类对象;
- 测试代码:在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。
在应用程序开发中的应用:
- GUI界面开发:MVC模式中的控制器对象就是一个中介者对象,它负责协调视图和模型之间的通信;
- 聊天室系统:聊天室系统中,中介者对象负责协调用户之间的通信;
- 游戏开发:游戏中的AI控制器就是一个中介者对象,它协调游戏中各个对象之间的通信。
二、中介者模式使用
工作原理:
- 当一个对象发生变化时,它会通知中介者对象;
- 中介者对象接收到通知后,会调用其他对象的方法,从而完成对象之间的通信;
- 当对象之间需要通信时,它们会向中介者对象发送请求,然后中介者对象会转发请求给其他对象,从而完成对象之间的通信。
示例:实现播放器功能
举例说明Python中介者模式:
假设我们要开发一个简单的多媒体播放器,其中有三个按钮:播放、停止、暂停,以及一个文本框用于显示当前状态。每个按钮和文本框都是一个对象,三个按钮之间需要相互通信。如果每个按钮都直接和其他按钮通信,代码会变得非常复杂,而且难以维护。这时候可以使用中介者模式来降低对象之间的耦合度,并提高系统的可维护性。
工作原理:
- 创建中介者类,包含用于协调和控制对象之间通信的方法;
- 创建抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
- 创建具体对象类,实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
- 创建中介者对象,并在其中保存所有的抽象对象类对象;
- 在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。
以下是示例Python代码实现:
# 创建中介者类, 播放器
class Mediator():
def __init__(self):
self.play_button = None # 播放
self.stop_button = None # 停止
self.pause_button = None# 暂停
self.text_box = None # 文本框:显示当前状态
def set_play_button(self, play_button):
self.play_button = play_button
def set_stop_button(self, stop_button):
self.stop_button = stop_button
def set_pause_button(self, pause_button):
self.pause_button = pause_button
def set_text_box(self, text_box):
self.text_box = text_box
def play(self):
self.text_box.set_text("Playing...")
def stop(self):
self.text_box.set_text("Stoppped.")
def pause(self):
self.text_box.set_text("Paused.")
# 创建抽象对象类
class Buttton():
def __init__(self, mediator):
self.mediator = mediator
def click(self):
pass
class TextBox():
def __init__(self, mediator):
self.text = ""
self.mediator = mediator
def set_text(self, text):
self.text = text
print(self.text)
# 定义具体对象类
class PlayButton(Buttton):
def click(self):
self.mediator.play()
class StopButton(Buttton):
def click(self):
self.mediator.stop()
class PauseButton(Buttton):
def click(self):
self.mediator.pause()
# 创建对象
mediator = Mediator()
play_button = PlayButton(mediator)
stop_button = StopButton(mediator)
pause_button = PauseButton(mediator)
text_box = TextBox(mediator)
mediator.set_play_button(play_button)
mediator.set_stop_button(stop_button)
mediator.set_pause_button(pause_button)
mediator.set_text_box(text_box)
play_button.click()
pause_button.click()
stop_button.click()
运行结果:
Playing...
Paused.
Stoppped.
在上述代码中,我们创建了一个中介者类Mediator,抽象对象类Button和TextBox,以及具体对象类PlayButton、StopButton和PauseButton。其中,抽象对象类Button和TextBox都包含一个指向中介者对象的成员变量mediator,具体对象类PlayButton、StopButton和PauseButton实现了抽象对象类Button的click方法,并在其中调用中介者对象的play、pause和stop方法。在中介者类Mediator中,我们定义了三个方法play、stop和pause,并在其中设置了文本框的内容。
在测试代码中,我们创建了按钮和文本框对象,并将它们设置到中介者对象中。然后通过调用按钮对象的click方法来模拟用户点击按钮的行为,从而触发各个对象之间的通信。最终,我们可以看到文本框上输出了正确的状态信息,证明各个对象之间的通信已经成功完成。
使用方法:
- 定义中介者类,包含用于协调和控制对象之间通信的方法;
- 定义抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
- 实现具体对象类,实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
- 创建中介者对象,并在其中保存所有的抽象对象类对象;
- 在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。
三、附录
不同class之间的方法通过实例化对象来互相调用
class A():
def method_a(self):
print("method_a")
b = B()
b.method_b()
class B():
def method_b(self):
print("method_b")
a = A()
a.method_a() # 输出 method_a 和 method_b