Python设计模式-18-中介模式

发布时间 2023-06-16 18:50:24作者: 韩志超

中介模式是一种行为型设计模式,它允许对象之间通过一个中介对象进行通信,从而减少对象之间的直接耦合。中介模式通常包括以下几个角色:

  • 中介者(Mediator):定义了一个接口,用于与各个同事对象通信,并协调它们之间的交互。

  • 具体中介者(Concrete Mediator):实现了中介者定义的接口,并协调各个同事对象之间的交互。

  • 同事对象(Colleague):定义了一个接口,用于与中介者通信。

具体同事对象(Concrete Colleague):实现了同事对象定义的接口,并与其他同事对象通过中介者进行通信。

下面是一个简单的 Python 示例,演示了如何使用中介模式:

class Mediator:
    def send(self, message, colleague):
        pass

class ConcreteMediator(Mediator):
    def __init__(self):
        self.colleague_a = None
        self.colleague_b = None

    def set_colleague_a(self, colleague_a):
        self.colleague_a = colleague_a

    def set_colleague_b(self, colleague_b):
        self.colleague_b = colleague_b

    def send(self, message, colleague):
        if colleague == self.colleague_a:
            self.colleague_b.receive(message)
        elif colleague == self.colleague_b:
            self.colleague_a.receive(message)

class Colleague:
    def __init__(self, mediator):
        self.mediator = mediator

    def send(self, message):
        self.mediator.send(message, self)

    def receive(self, message):
        pass

class ConcreteColleagueA(Colleague):
    def receive(self, message):
        print(f'ConcreteColleagueA: Received "{message}".')

class ConcreteColleagueB(Colleague):
    def receive(self, message):
        print(f'ConcreteColleagueB: Received "{message}".')

mediator = ConcreteMediator()

colleague_a= ConcreteColleagueA(mediator)
colleague_b = ConcreteColleagueB(mediator)

mediator.set_colleague_a(colleague_a)
mediator.set_colleague_b(colleague_b)

colleague_a.send('Hello, colleague B!')
colleague_b.send('Hi, colleague A!')

在上面的示例中,我们定义了一个中介者 Mediator,它定义了一个接口 send(),用于与各个同事对象通信,并协调它们之间的交互。然后,我们定义了一个具体中介者 ConcreteMediator,它实现了中介者定义的接口,并协调各个同事对象之间的交互。接下来,我们定义了一个同事对象 Colleague,它定义了一个接口 send() receive(),用于与中介者通信。然后,我们定义了两个具体同事对象 ConcreteColleagueAConcreteColleagueB,它们实现了同事对象定义的接口,并与其他同事对象通过中介者进行通信。

在使用中介模式时,我们可以通过一个中介者对象来协调各个同事对象之间的交互,从而减少对象之间的直接耦合。在上面的示例中,我们创建了一个中介者对象 mediator,并将它分别设置为两个同事对象 colleague_acolleague_b 的中介者。当同事对象调用send() 方法时,它会将消息发送给中介者,然后中介者会将消息转发给其他同事对象。需要注意的是,中介模式可以帮助我们减少对象之间的直接耦合,从而提高代码的可维护性和可扩展性。