python 设计模式之中介者模式
#先啰嗦一下
至少半个多月的样子没写博客了,月初去了趟黄山,赏了美景,自然没时间也没条件敲博客了,一个多星期就这么过去了。返回深圳后,工作积压了一堆,然后白天就马不停蹄的忙工作,晚上回家伺候小娃,又想早点休息,那是没时间开机的。大头小头的工作也忙了一轮,第二轮还没开始,这点空隙就是珍贵的博客时间。做it这个行业,不管是开发还是测试,都不敢怠慢,知识更新太快,所以几天不学,心里就发慌。我们能靠的人不多,选择靠自己是最靠谱的事。所以有点时间我就写博客。
#为什么要用中介者模式
假设现在科技发达之后,家里所有设备都是智能化的。
而小明在家洗澡的时候有个习惯就是喜欢听歌,而且洗澡时候还要把窗帘拉上。
因此就有这种情形,小明要拉窗帘可能就是要洗澡,当然也要听歌。
因此我们希望小明家的洗浴设备,音响设备和窗帘设备都能协同合作,不管操作哪种设备,其他两种设备都有一定响应。
以此写出程序。
这个程序最主要的功能就是在 一个类里完成了对另外两个类的方法作用。
但是这样设计有两个主要缺陷(其实是对象之间耦合度过高而引起的)一旦窗帘设备坏掉,需要更换,那样我们就要让新的窗帘设备建立别的设备的连接,这样会很麻烦
如果我们又有别的需求,比如洗澡的时候要把门锁住,那门锁的智能设备又要关联所有设备,更加麻烦。
引入中介者
中介者模式的引入则极大的弥补了上述程序的两个缺陷,对象交互如下图
其实中介者就好比智能家居的管家,这样所有对象的交互指令都通过它来传达,这样这个中介者负责与对象之间联系,对象与对象之间不再进行直接的交互,也就是对对象关系 进行解耦。
#中介者模式(Mediator)定义
用一个中介对象来封装一系列的对象交互中介者使得=各对象不需要显示的相互引用,从而使其松耦合,而且可以独立地改变他们之间的交互。
#中介者模式涉及角色
#中介者模式应用场景
当有多个对象彼此间相互交互的时候,自然就会想到对象间的耦合度过高,解决办法就是封装对象间的交互行为,因此就能想到中介者模式就是干这行的。
#中介者模式优点
通过让对象彼此解耦,增加对象的复用性
通过将控制逻辑集中,可以简化系统维护
通过中介者使一对所变成了一堆一,便于理解
#中介者模式缺点
如果涉及不好,引入中介者会使程序变的复杂
中介者承担过多责任,是中心化模式,若中介者出现了问题,整个系统将会崩溃
#中介者模式结构图
#举个栗子
#抽象中介者 class Mediator: def __init__(self,comp,name): self.name=name self.comp=comp def send(self,message,clooeague): pass #抽象同事类 class Colleague: mediator=None def __init__(self,mediator): self.mediator=mediator #具体同事类1 class ConcreteColleagueA(Colleague): #房东 def zhaozu(mediator,name,address,area,price): fdm='你好,我是房东{0},我的房子在{1},面积是{2},租金是{3}'.format(name,address,area,price) return fdm #具体同事类1 class ConcreteColleagueB(Colleague): #租客 def qiuzu(mediator,name,address,area,price): zkm='你好,我是租客{0},我的想租的房子大概在{1},面积大概是{2},租金大概是{3}'.format(name,address,area,price) return zkm #具体中介类 class ConcreteMediator(Mediator): fd='' zk='' def introSelf(self,comp,name): print('您好,我是{0}公司的{1},以后我来为您找到合适的房子或合适的租客'.format(comp,name)) print('=========================') def __init__(self,name): self.name=name def Send(self,name,message): if self.name=='fd': print('房东你好,已收到你的放租消息,我马上联系租客') print('zk 你好,房东的消息是: %s' % message) else: print('租客你好,已收到你的求租消息,我马上联系房东') print('fd 你好,租客的消息是: %s' % message) if __name__=='__main__': mediator=ConcreteMediator('fd') mediator.introSelf('zy','xf') c1=ConcreteColleagueA fdmm=c1.zhaozu('xf','fd','nanshan','80','7000') mediator.Send('fd',fdmm) print('=========================') mediator=ConcreteMediator('zk') c2=ConcreteColleagueB zkmm=c2.qiuzu('xf','zk','nanshan','70','6000') mediator.Send('zk',zkmm)
参考
https://blog.csdn.net/zhen921/article/details/82316707
https://blog.csdn.net/jdhellfire/article/details/91357619
https://blog.csdn.net/M_azed/article/details/91995863
https://blog.csdn.net/ponder008/article/details/6912119?ABstrategy=codes_snippets_optimize_v4