设计模式十二:命令模式

什么是命令模式

将一个操作(撤销、重做、复制、粘贴等)封装成一个对象。

使用优势

不需要直接执行一个命令,命令可以按照希望执行。
调用命令的对象与知道如何执行命令的对象解耦。
调用者无需知道命令的任何实现细节。
可以把多个命令组织起来,调用者能够按顺序执行。

使用场景

如果一个操作需要多次被调用,并且需要在不同场景调用,那么就可以将其封装成一个对象

典型案例

餐馆点餐,每个账单都是独立的,但是每个账单都可以执行许多不同命令,
比如 点菜命令(可以点不同菜加入到烹煮队列里),撤销命令等

实例代码

import os
class RenameFile:def __init__(self,srcpath,destpath):self.src,self.dest = srcpath,destpathdef execute(self):os.rename(self.src,self.dest)def undo(self):os.rename(self.dest,self.src)class CreateFile:def __init__(self,path,txt='11111111111111\n'):self.path,self.txt = path,txtdef execute(self):with open(self.path,mode = 'w',encoding='utf-8') as f:f.write(self.txt)def undo(self):delete_file(self.path)class ReadFile:def __init__(self,path):self.path = pathdef execute(self):with open(self.path,mode = 'r' ,encoding='utf-8') as f:print(f.read(),end='')# 删除文件的命令可以是一个方法,不一定是要和其他命令一样
def delete_file(path):os.remove(path)def main():orig , new = 'file1','file2'command = []for cmd in CreateFile(orig),ReadFile(orig),RenameFile(orig,new):command.append(cmd)[c.execute() for c in command]answer = input('reverse the executed command?[y/n]')if answer not in 'yY':print('the result is {}',format(new))exit()# 执行撤销动作时,需要从后往前撤销,所以需要reversed方法来反转列表for c in reversed(commands):try:c.undo()except AttributeError as e:passif __name__ == "__main__":main()

Python设计模式:命令模式相关推荐

  1. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  2. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  3. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  4. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  5. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  6. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  7. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  8. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  9. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  10. 设计模式 命令模式 实例_根据您的命令-命令设计模式

    设计模式 命令模式 实例 命令设计模式是一种广为人知的设计模式,属于行为设计模式("四人帮"的一部分). 顾名思义,它与应用程序中的动作和事件有关. 问题陈述: 假设有一个网页将在 ...

最新文章

  1. char的初始值_java从入门到放弃 各种数组的初始值?
  2. orcad快捷键_lt;SCHgt; ORCAD 快捷键
  3. 框架:springboot组合spring、springmvc、mybatis的一个小demo
  4. 通过/proc/PID/status查看进程内存占用情况
  5. 浅析Linux awk命令
  6. 使用 RxJs Observable 来避免 Angular 应用中的 Promise 使用
  7. Qt QByteArray 转换 QString QT5.12.7
  8. import 别名_Python基础找茬系列09--import和from-import的引用区别
  9. 教你玩转CSS margin(外边距)
  10. jdk1.8对synchronized锁的优化
  11. 学习Python可以从事哪些工作?
  12. win7计算机里没有网络图标,Win7网络图标不见了?找回网络图标的方法
  13. 非越狱iPad实现外接键盘全APP五笔输入(IOS14已自带五笔)
  14. 设计一个简单的家乡网站
  15. java简历校园经历_简历校园经历如何编
  16. 一阶二阶常微分方程解法
  17. 下载网站的ICO图标方法
  18. react全局状态管理_Recoil - Facebook 官方 React 状态管理器
  19. matlab tecplot data,MATLAB讀取TECPLOT笛卡爾網格三維流場數據
  20. java线程详细介绍

热门文章

  1. 更新mac自带的python
  2. 【转载】别了,摩托罗拉(十一):小高尔文“新政”
  3. 如何减小数据库日志文件.ldf
  4. [翻译]XNA 3.0 Game Programming Recipes之six
  5. oracle 能被2整除_整除专题基础篇 “刀法四式”
  6. datalist获取id传到下一个页面_如何在 Serverless 架构下优雅上传文件?
  7. 网络七层协议(转载)
  8. visual studio运行时库MT、MTd、MD、MDd的区别
  9. C++中回调(CallBack)的使用方法
  10. c语言考试笔试技巧,全国二级C语言,要考试了这些技巧你知道么?