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语句在查询操作时执行的顺序: (1)from (2) on (3) join (4) where (5)group by (6) avg,sum ...
- Linux中条件语句
Linux中备份一个jar包,需要既判断进程是否停止,又判断文件是否存在 1. 进程停了,文件存在则备份 2.进程停了,文件不存在,无需备份 3. 进程在跑,停止进程:文件存在,将文件进行备份 4. ...
- Helix QAC — 软件静态测试工具
Helix QAC 是Perforce 公司(原PRQA 公司)产品,主要用于C/C++ 代码的完全自动化静态分析工作,可以提供编码规则检查.代码质量度量.软件结构分析.测试结果管理等功能.Helix ...
- kali系统无法使用ll命令
ll命令:也就是ls -l的缩写方式. 重装kali系统之后,发现无法使用ll命令了,于是写一个笔记记录一下如何添加ll命令. 解决方法: vim ~/.bashrc 将alias ll=’ls -l ...
- 基于Java+Selenium的WebUI自动化测试框架(二)-----页面操作接口
在有了基础的Position类之后,我们需要考虑我们在寻找完页面元素之后,需要做什么.这个“做”什么,可以理解为我们在页面上需要对应的一系列动作.比如:点击,输入,切换窗口,寻找元素,判断元素是否存在 ...
- Docker那些事儿之镜像创建
之前已经了解了docker的基本使用方式,简单的上手,也能让大部分人了解到这个技术的使用方法,今天继续说明docker如何构建自己所需要的镜像,开发人员掌握使用基础即可,有兴趣的可以自行深入研究 前言 ...
- seo与python大数据结合给文本分词并提取高频词
最近研究seo和python如何结合,参考网上的一些资料,写的这个程序. 目的:分析某个行业(例如:圆柱模板)用户最关心的一些词,根据需求去自动调整TDK,以及栏目,内容页的规划 使用方法: 1.下载 ...
- rhel7.0替换centos yum源
1:卸载原先的yum 2:安装centos的yum 有以下的yum yum-utils-1.1.31-24.el7.noarch yum-langpacks-0.4.2-3.el7.noarch yu ...
- IAR平台移植TI OSAL到STC8A8K64S4A12单片机中
玩过TI 的ZigBee或者BLE的人,都会接触到OSAL.OSAL是什么?OSAL英文全称:operating system abstraction layer(操作系统抽象层).基于OSAL的调度 ...
- Longest Continuous Increasing Subsequence
Description Give an integer array,find the longest increasing continuous subsequence in this array. ...