用於封装一系列同事对象交互通信之中間媒介,此模式可使各同事对象不需要以显式直接作交互作用,从而使其達到解耦之目的,并可容易日後來改变它们之间的交互,一般应用於一组同事对象已被良好定义但須以复杂方式來进行交互通信之场合中。
类图:
示例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
Import abc
class Mediator(object): #中介者抽象基类
@abc.abstractmethod
def send(self,message,colleague): #轉介交互訊息給colleague
raise NotImplementedError
class ConcreteMediator(Mediator): #中介者具体类
def __init__(self):
self.colleague1 = ""
self.colleague2 = ""
def send(self,message,colleague):
if self.colleague1 == colleague:
self.colleague2.get_message(message)
elif self.colleague2 == colleague:
self.colleague1.get_message(message)
else:
print('無同事对象可處理')
class Colleague(object): #同事基类
def __init__(self):
self.mediator = ""
def bind(self,mediator):
self.mediator = mediator
class Colleague1(Colleague): #同事具体子类1
def send(self, message):
self.mediator.send(message,self) #此self傳參是指定本類給colleague
def get_message(self,message):
print("同事类1接收訊息:",message)
class Colleague2(Colleague): #同事具体子类2
def send(self, message):
self.mediator.send(message,self)
def get_message(self,message):
print("同事类2接收訊息:",message)
#實際業務邏輯之場景如下:
if __name__ == "__main__":
# 创建同事及中介者具体类
c1 = Colleague1()
c2 = Colleague2()
cm = ConcreteMediator()
#交互者绑定中介者
c1.bind(cm)
c2.bind(cm)
cm.colleague1 = c1
cm.colleague2 = c2
#对象交互
c1.send('由同事类1發佈訊息')
c2.send('由同事类2發佈訊息')
輸出:
同事类2接收訊息: 由同事类1發佈訊息
同事类1接收訊息: 由同事类2發佈訊息
總結:
优点:
- 减少對象間之依赖以降低耦合程度
- 容易扩展對象规模。
缺点:
- 當處理對象眾多則會造成中介者对象本身的复杂性会很龐大,且其轉介處理之逻辑会變得很复杂。