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设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
随机推荐
- 如何使用Systemctl管理系统服务和单元?
chu原文:How To Use Systemctl to Manage Systemd Services and Units 简书:如何使用Systemctl管理系统服务和单元? 引言 System ...
- 基于CentOS构建企业镜像站
参考:How to Setup Local HTTP Yum Repository on CentOS 7 实验环境 CentOS7 1804 步骤一:安装Nginx Web Server 最小化安装 ...
- 在openwrt 17.01上编译最新nginx 1.14.2的笔记
openwrt 17.01源码对应的nginx版本是1.10.2,有些新功能没有,所以需要升级到nginx 1.14.2最新的稳定版 https://github.com/macports/macpo ...
- VirtualBox、VMware在桥接模式下无法获取ip地址问题
声明: 参考 https://blog.csdn.net/lcdcxy/article/details/49362171 https://jingyan.baidu.com/article/948f5 ...
- Linux 本机/异机文件对比
一:提取异步机器文件 #ssh 192.168.1.2 "cat /etc/glance/glance-api.conf | grep -v '#' |grep -v ^$" 二: ...
- 基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG
在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样.但是,我们这里先停一下.原因有二: 1)既然是写一个框架,我们希望总体的功能上是全面的.实现类中,我 ...
- ES6 Class(类)的继承与常用方法
一.ES6 类的定义 ES5 构造函数的写法: function Point(x, y) { this.x = x; this.y = y; } ES6 引入了 Class(类),通过class关键字 ...
- ARP详解
1.学习ARP前要了解的内容 建立TCP连接与ARP的关系 应用接受用户提交的数据,触发TCP建立连接,TCP的第一个SYN报文通过connect函数到达IP层,IP层通过查询路由表: 如果目的IP和 ...
- ORACLE数据库误操作执行了DELETE,该如何恢复数据?
ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...
- sql sever 触发器的概念和使用
触发器简介: 触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是由事件来触发.触发器是当对某一个表进行操作.例如:update.insert.delete这些操作的时候,系统会自 ...