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

posted @ 2019-06-26 14:26  筱筱的春天  阅读(885)  评论(1编辑  收藏  举报