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 相关文章推荐
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python中每次处理一个字符的5种方法
May 21 Python
python妹子图简单爬虫实例
Jul 07 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
详解python之heapq模块及排序操作
Apr 04 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
pandas实现将日期转换成timestamp
Dec 07 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 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
Look And Say 序列php实现代码
2011/05/22 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
javascript  Error 对象 错误处理
2008/05/18 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
采用call方式实现js继承
2014/05/20 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python创建线程示例
2014/05/06 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
复试通知单模板
2015/04/24 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书