Python设计模式之中介模式简单示例


Posted in Python onJanuary 09, 2018

本文实例讲述了Python设计模式之中介模式。分享给大家供大家参考,具体如下:

Mediator Pattern:中介模式

中介模式提供了一系列统一的系统接口。此模式也被认为是行为模式,因为他能选择程序处理流程

当许多类开始在交互中产生结果时,可以选用中介模式。当软件开始组织的时候,许多用户的要求添加更多的功能。

这就导致了要和以前的类不断交互,除了新类。随着系统的复杂度加大,类之间的交互变得频繁,维护代码变得困难。

中介模式 就是为了解决这个问题,通过允许类之间的松耦合。这样中介模式就能了解系统中所有类的功能。类的功能就是与中介类进行交互。当类与类之间需要交互的时候,类就发送信息给中介,中介就转发信息给被请求的类。通过这样,类与类之间的复杂度就减少了。

一个简单的中介模式例子:

一个类型的中介模式例子可以在测试自动框架(包含4个类,TC,TestManager,Reporter ,DB)中被证明。

1.TC类是测试的响应,借助方法setup(),execute(),tearDown()。
2.Reporter类调用

当测试分类开始执行时,调用prepare方法。
当测试分类完成执行时,调用report()方法 ,
框架的测试响应就是好的帮助文档。

我也没弄懂中介模式,让人犯晕!

代码贴出来:

import time
class TC:
  def __init__(self):
    self._tm = tm
    self._bProblem = 0
  def setup(self):
    print "Setting up the Test"
    time.sleep(1)
    self._tm.prepareReporting()
  def execute(self):
    if not self._bProblem:
      print "Executing the test"
      time.sleep(1)
    else:
      print "Problem in setup,Test not executed."
  def tearDown(self):
    if not self._bProblem:
      print "Tearing down"
      time.sleep(1)
      self._tm.publishReport()
    else:
      print "Test not executed.No tear down required."
  def setTM(self, TM):
    self._tm = tm
  def setProblem(self, value):
    self._bProblem = value
class Reporter:
  def __init__(self):
    self._tm = None
  def prepare(self):
    print "Reporter Class is preparing to report the results"
    time.sleep(1)
  def report(self):
    print "Reporting the results of Test"
    time.sleep(1)
  def setTM(self, TM):
    self._tm = tm
class DB:
  def __init__(self):
    self._tm = None
  def insert(self):
    print "Inserting the execution begin status in the Database"
    time.sleep(1)
    import random
    if random.randrange(1,4) == 3:
      return -1
  def update(self):
    print "Updating the test results in Database"
    time.sleep(1)
  def setTM(self, TM):
    self._tm = tm
class TestManager:
  def __init__(self):
    self._reporter = None
    self._db = None
    self._tc = None
  def prepareReporting(self):
    rvalue = self._db.insert()
    if rvalue == -1:
      self._tc.setProblem(1)
      self._reporter.prepare()
  def setReporter(self, reporter):
    self._reporter = reporter
  def setDB(self, db):
    self._db = db
  def publishReport(self):
    self._db.update()
    rvalue = self._reporter.report()
  def setTC(self, tc):
    self._tc = tc
if __name__ == '__main__':
  reporter = Reporter()
  db = DB()
  tm = TestManager()
  tm.setReporter(reporter)
  tm.setDB(db)
  reporter.setTM(tm)
  db.setTM(tm)
  while(1):
    tc = TC()
    tc.setTM(tm)
    tm.setTC(tc)
    tc.setup()
    tc.execute()
    tc.tearDown()

运行结果:

Python设计模式之中介模式简单示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python通过线程实现定时器timer的方法
Mar 16 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
opencv3/C++ 平面对象识别&透视变换方式
Dec 11 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
Django模型验证器介绍与源码分析
Sep 08 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 Python
python+opencv实现动态物体追踪
Jan 09 #Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 #Python
Python设计模式之代理模式简单示例
Jan 09 #Python
基于python内置函数与匿名函数详解
Jan 09 #Python
Python设计模式之工厂模式简单示例
Jan 09 #Python
浅谈numpy库的常用基本操作方法
Jan 09 #Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 #Python
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
用PHP实现的随机广告显示代码
2007/06/14 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
JSON相关知识汇总
2015/07/03 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python中pip的安装与使用教程
2018/08/10 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
《可爱的动物》教学反思
2014/02/22 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书