zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    黎活明给程序员的忠告
    servlet单实例多线程模式
    Servlet 获取多个参数
    Java Servlet学习笔记(四)Servlet客户端Http请求
    JavaWeb 后端 <二> 之 Servlet 学习笔记
    Servlet 规范笔记—基于http协议的servlet
    Servlet 规范笔记—servlet概念及结构
    看懂UML类图和时序图
    hibernate中的事务管理是怎么概念?
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11089655.html
Copyright © 2011-2022 走看看