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
python 设计模式之中介者模式的更多相关文章
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 折腾Java设计模式之中介者模式
博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...
- python设计模式之常用创建模式总结(二)
前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...
- 实例解析Python设计模式编程之桥接模式的运用
实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- python设计模式之享元模式
python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...
- python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
随机推荐
- Mysql 中完善的帮助命令
Mysql 中完善的帮助命令 Mysql 中的帮助系统很完善,很多操作都可以通过命令行直接获得帮助,如下示例: Mysql 命令行帮助 [root@mysql1 mydata1]# mysql -S ...
- OpenStack 2014.1(Icehouse) 更新说明
OpenStack 2014.1(Icehouse) 更新说明 1.综合升级说明 Windows安装包应使用PBR 0.8版本,以避免发生bug1294246 log-config选项 ...
- Python基础笔记一
1. 分片的步长,默认为值1,表示为 xx[s:t:v] ----从索引s到索引t,每隔v,取对应索引位置的值 xx = 'hello,world' #从索引0-10,共11个字符 xx[2:] #从 ...
- 拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
一.引言 本来想记录一下关于用户登陆和登陆之后的权限管理.菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序 ...
- matlab(2) Logistic Regression: 画出样本数据点plotData
画出data数据 data数据 34.62365962451697,78.0246928153624,030.28671076822607,43.89499752400101,035.84740876 ...
- Spring如何给静态变量注入值
Common.java是一个工具类. Spring无法直接给静态变量注入值,因为静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring ...
- Mybatis之foreach批量插入
1接口 public boolean insertMembersBatch(@Param("memberList") List<Members> members); @ ...
- bzoj3097 hash killer 1——构造题
题意 在 $u64$ 自然溢出下,请输出一串字符串和 $L$,使得对任意 $Base$ 都能找到两个长度为 $L$ 的字串的 $Hash$ 值相同. 分析 $u64$ 自然溢出等价于两个哈希值模 $2 ...
- 56、servlet3.0-与SpringMVC整合分析
56.servlet3.0-与SpringMVC整合分析 web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainer ...
- 使用 ServerSocket 建立聊天服务器-1
1.代码目录 2.ChatSocket.java --------------------------------------------------------------------------- ...