Python中介者模式介绍、使用

目录

一、Python中介者模式介绍

二、中介者模式使用

工作原理:

示例:实现播放器功能

三、附录

不同class之间的方法通过实例化对象来互相调用


一、Python中介者模式介绍

Python中介者模式是一种行为型设计模式,它允许多个对象之间进行通信而不必直接相互引用。在这种模式中,一个中介者对象控制多个对象之间的通信,从而减少对象之间的耦合度。

功能:

  1. 将对象间的复杂关系转换为中介者与对象之间的简单关系;
  2. 降低系统的耦合度,使得对象之间可以独立地变化;
  3. 促进对象之间的协作和沟通,提高系统的可维护性和可扩展性。

优点:

  1. 可以降低对象之间的耦合度,减少代码重复;
  2. 可以实现对象间的松耦合,使得系统的扩展和维护更加容易;
  3. 可以提高系统的灵活性,使得系统更易于协作和沟通。

缺点:

  1. 中介者对象可能会变得复杂,难以维护;
  2. 中介者模式可能会导致系统性能降低,因为对象之间的通信需要通过中介者对象传递。

应用场景:

  1. 对象之间的交互比较复杂,且难以维护;
  2. 对象之间的耦合度比较高,难以实现对象的松耦合;
  3. 对象之间的通信需要通过一个中介者进行协调和控制。

使用方式:

  1. 定义中介者接口:定义中介者类,包含用于协调和控制对象之间通信的方法;
  2. 定义抽象对象类:定义抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
  3. 实现具体对象类:实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
  4. 构建中介者对象:构建中介者对象,并在其中保存所有的抽象对象类对象;
  5. 测试代码:在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。

在应用程序开发中的应用:

  1. GUI界面开发:MVC模式中的控制器对象就是一个中介者对象,它负责协调视图和模型之间的通信;
  2. 聊天室系统:聊天室系统中,中介者对象负责协调用户之间的通信;
  3. 游戏开发:游戏中的AI控制器就是一个中介者对象,它协调游戏中各个对象之间的通信。

二、中介者模式使用

工作原理:

  1. 当一个对象发生变化时,它会通知中介者对象;
  2. 中介者对象接收到通知后,会调用其他对象的方法,从而完成对象之间的通信;
  3. 当对象之间需要通信时,它们会向中介者对象发送请求,然后中介者对象会转发请求给其他对象,从而完成对象之间的通信。

示例:实现播放器功能

举例说明Python中介者模式:

假设我们要开发一个简单的多媒体播放器,其中有三个按钮:播放、停止、暂停,以及一个文本框用于显示当前状态。每个按钮和文本框都是一个对象,三个按钮之间需要相互通信。如果每个按钮都直接和其他按钮通信,代码会变得非常复杂,而且难以维护。这时候可以使用中介者模式来降低对象之间的耦合度,并提高系统的可维护性。

工作原理:

  1. 创建中介者类,包含用于协调和控制对象之间通信的方法;
  2. 创建抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
  3. 创建具体对象类,实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
  4. 创建中介者对象,并在其中保存所有的抽象对象类对象;
  5. 在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。

以下是示例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方法来模拟用户点击按钮的行为,从而触发各个对象之间的通信。最终,我们可以看到文本框上输出了正确的状态信息,证明各个对象之间的通信已经成功完成。

使用方法:

  1. 定义中介者类,包含用于协调和控制对象之间通信的方法;
  2. 定义抽象对象类,包含需要协调和控制的方法,以及一个保存中介者对象的成员变量;
  3. 实现具体对象类,实现抽象对象类的方法,并在其中调用中介者对象的方法,完成对象之间的通信;
  4. 创建中介者对象,并在其中保存所有的抽象对象类对象;
  5. 在客户端代码中创建抽象对象类和中介者对象,然后使用抽象对象类对象调用方法,完成对象之间的通信。

三、附录

不同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

你可能感兴趣的:(Python,python,中介者模式,开发语言)