Python设计模式之命令模式简单示例


Posted in Python onJanuary 10, 2018

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

命令模式介绍:

在面向对象编程中,命令模式是概括所有方法信息的设计模式。

此模式对象包涵方法名,及其相关参数值。

命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵了所有用户需要的方法。

举个例子:如果有个按钮是用户接口“red”,当被触碰的时候,会启动后台的“turn red”接口。现在用户并不知道,通过什么类或者方法的接口能够让后台处理“turn red”操作,但是这个命令被发送了(触碰“red”按钮),会使得后台处理“turn red”操作。因此,命令模式给用户一个接口,而不用让用户了解哪些是实际执行的程序,也不会影响到用户程序。

实现命令模式的关键就是让调用者不要包涵底层实际命令执行代码,相同的调用者应该采用相同的接口。

命令模式是由三个组件构成,客户,调用者,接受者。

客户:一个实例化的对象

调用者:决定哪个方法被调用

接受者:实际命令的执行者

Python设计模式之命令模式简单示例

Example:

实现一个开关
切换ON/OFF
用开关ON/OFF去硬编码一个事件

代码如下:

class Switch:
 ''' The INVOKER class'''
 def __init__(self, flipUpCmd, flipDownCmd):
  self.__flipUpCommand = flipUpCmd
  self.__flipDownCommand = flipDownCmd
 def flipUp(self):
  self.__flipUpCommand.execute()
 def flipDown(self):
  self.__flipDownCommand.execute()
class Light:
 '''The RECEIVER Class'''
 def turnOn(self):
  print "The light is on"
 def turnOff(self):
  print "The light is off"
class Command:
 """The Command Abstrace class"""
 def __init__(self):
  pass
 def execute(self):
  pass
class FlipUpCommand(Command):
 '''The Command class for turning on the light'''
 def __init__(self, light):
  self.__light = light
 def execute(self):
  self.__light.turnOn()
class FileDownCommand(Command):
 '''The Command class for turning off the light'''
 def __init__(self, light):
  Command.__init__(self)
  self.__light = light
 def execute(self):
  self.__light.turnOff()
class LightSwitch:
 '''The Client Class'''
 def __init__(self):
  self.__lamp = Light()
  self.__switchUp = FlipUpCommand(self.__lamp)
  self.__switchDown = FileDownCommand(self.__lamp)
  self.__switch = Switch(self.__switchUp, self.__switchDown)
 def switch(self, cmd):
  cmd = cmd.strip().upper()
  try:
   if cmd == "ON":
    self.__switch.flipUp()
   elif cmd == "OFF":
    self.__switch.flipDown()
   else:
    print "Argument \"ON\" or \"OFF\" is required"
  except Exception,msg:
   print "Exception occured:%s" % msg
#Execute if the file is run as a script and not imported as a module
if __name__ == "__main__":
 lightSwitch = LightSwitch()
 print "Switch ON test"
 lightSwitch.switch("ON")
 print "Switch OFF test"
 lightSwitch.switch("OFF")
 print "Invalid Command test"
 lightSwitch.switch("****")

运行结果:

Python设计模式之命令模式简单示例

总结:面向对象的方法,就是这么牛叉啊,代码看得让人头晕,层层的封装。警惕面向对象编程的过度对象化。

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

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

Python 相关文章推荐
Python迭代用法实例教程
Sep 08 Python
Python生成不重复随机值的方法
May 11 Python
Python3.6正式版新特性预览
Dec 15 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Pyspider中给爬虫伪造随机请求头的实例
May 07 Python
Pycharm配置远程调试的方法步骤
Dec 17 Python
Python实现名片管理系统
Feb 14 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
简述python Scrapy框架
Aug 17 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
python实现双向链表原理
May 25 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 #Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 #Python
Python设计模式之观察者模式简单示例
Jan 10 #Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 #Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 #Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 #Python
Python中join函数简单代码示例
Jan 09 #Python
You might like
PHP学习之整理字符串
2011/04/17 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
django的autoreload机制实现
2020/06/03 Python
python中get和post有什么区别
2020/06/19 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
AOP的定义以及作用
2013/09/08 面试题
单位法定代表人授权委托书
2014/09/20 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
python基础之函数的定义和调用
2021/10/24 Python