0
点赞
收藏
分享

微信扫一扫

Aha!设计模式(92)-中介者模式(4)


效果

 

使用中介者模式可以:

有利于提炼可复用的共通功能。所有的同事类只需要和处于信息交换中心的中介者类进行交互,而不需要知道其他控件的存在。这样既减少了沟通渠道,又降低了同事类之间的耦合性。

业务逻辑容易理解。终结者类作为信息交换的中心,同时也是信息处理的中心。由于所有和业务逻辑相关的内容都集中在一处,理解和维护都变得很容易。

由于中介者类吸收了全部业务逻辑,所以同事类可以将注意力完全集中在自身功能上,由此产生的一个效果就是同事类可以很容易地实现可复用。

 

代码示例

 

示例代码基本上参照模式类图编写,为了便于理解,类名略有变更。首先是抽象中介者类。



class Mediator(metaclass=abc.ABCMeta):
@abc.abstractmethod
def notify(self, colleague):
raiseNotImplementedError

这里使用类似观察者模式的通知方式以获得最大限度的灵活性。接下来是抽象同事类。



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

抽象同事类管理一个中介者类的对象,用于发起和对象类之间的通信。



class TextEntry(Colleague):
def __init__(self,mediator):
Colleague.__init__(self, mediator)
self.text= ""
def set_text(self, text):
self.text= text
print('TextEntry:', self.text)
class ListBox(Colleague):
def __init__(self,mediator):
Colleague.__init__(self, mediator)
self.index= 0
defitem_selected(self):
self.index= self.index + 1
self.mediator.notify(self)
def get_selected(self):
returnself.index

示例代码唯一的功能就是在ListBox当前选项发生变化时,将选项索引表示在TextEntry中,因此实现的方法也仅限于该功能必须的部分。



class ConcreteMediator(Mediator):
def __init__(self):
self.lb= ListBox(self)
self.te= TextEntry(self)
def notify(self, colleague):
if colleague== self.lb:
self.te.set_text(self.lb.get_selected())
def test(self):
self.lb.item_selected()
if __name__ == '__main__':
mediator = ConcreteMediator()
mediator.test()

main函数中首先构建一个具象中介者类ConcreteMediator类的实例。在初始化处理中,ConcreteMediator以自身为参数构建ListBox类和TextEntry类的对象。这一步完成后,所有的准备工作就算就绪了。

 

接下来是通过中介者类ConcreteMedator的test调用ListBox的item_selected方法。在实际的开发中这个调用应该是发端于由于某个用户操作。在ListBox的item_selected方法中,ListBox首先根据内部逻辑决定自己的当前活动项,然后调用抽象中介者类的通知接口notify报告自己的变化。

 

中介者类处于信息交换的中心,接收来自动作控件的信息经过处理后再将处理结果发送给必要的接收者。具体到示例代码,Mediator类将只是简单地活动项的索引设置到TextEntry上。

 

微信公众号【面向对象思考】


举报

相关推荐

0 条评论