当前位置: 首页 > news >正文

行为型设计模式之命令模式(Command)

结构
意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
适用性
  • 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(c a l l b a c k )函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。C o m m a n d 模式是回调机制的一个面向对象的替代品。
  • 在不同的时刻指定、排列和执行请求。一个C o m m a n d 对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
  • 支持取消操作。C o m m a n d 的E x c u t e 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。C o m m a n d 接口必须添加一个U n e x e c u t e 操作,该操作取消上一次E x e c u t e 调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用U n e x e c u t e 和E x e c u t e 来实现重数不限的“取消”和“重做”。
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在C o m m a n d 接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用E x e c u t e 操作重新执行它们。
  • 用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( t r a n s a c t i o n )的信息系统中很常见。一个事务封装了对数据的一组变动。C o m m a n d 模式提供了对事务进行建模的方法。C o m m a n d 有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。

 

 1 using System;
 2 
 3     abstract class Command 
 4     {
 5         abstract public void Execute();
 6         protected Receiver r;
 7         public Receiver R
 8         {
 9             set 
10             {
11                 r = value; 
12             }
13         }
14     }
15 
16     class ConcreteCommand : Command
17     {
18         override public void Execute()
19         {
20             Console.WriteLine("Command executed");
21             r.InformAboutCommand();
22         }
23     }
24 
25     class Receiver 
26     {
27         public void InformAboutCommand()
28         {
29             Console.WriteLine("Receiver informed about command");
30         }
31         
32     }
33 
34     class Invoker 
35     {
36         private Command command;
37         public void StoreCommand(Command c)
38         {
39             command = c;
40         }
41         public void ExecuteCommand()
42         {
43             command.Execute();
44         }        
45     }
46 
47     /// <summary>
48     ///    Summary description for Client.
49     /// </summary>
50     public class Client
51     {
52         public static int Main(string[] args)
53         {        
54             // Set up everything
55             Command c = new ConcreteCommand();
56             Receiver r = new Receiver();
57             c.R = r;
58             Invoker i = new Invoker();
59             i.StoreCommand(c);
60 
61             // now let application run
62 
63             // the invoker is how the command is exposed for the end-user 
64             // (or a client) initiates the command, 
65             // (e.g. toolbar button, menu item)
66 
67             i.ExecuteCommand();
68 
69             return 0;
70         }
71     }
命令模式

 

转载于:https://www.cnblogs.com/ziranquliu/p/4660397.html

相关文章:

  • WPF DataGrid 每行ComboBox 内容不同的设置方法
  • 十五天精通WCF——第六天 你必须要了解的3种通信模式
  • 程序员如何成为架构师
  • java相关参数获取
  • css 3 获取设备宽度的方法
  • 简明易懂的call apply
  • sql中某条件不为空,可能有的小祖宗会喷了,这还用总结?emmm,我渣,我觉得有一点意思对于第二种(土味)...
  • 平衡二叉树AVL插入
  • 2018 年最常见的 Python 面试题 答案
  • 《基于场景的工程方法》作者问答录
  • nodejs-7.2. CURD数据管理系统小栗子
  • apache for mac OX S 10.10
  • bzoj3171: [Tjoi2013]循环格(费用流)
  • HDU 1956 POJ 1637 Sightseeing tour
  • ECMAScript6(0):ES6简明参考手册
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2018一半小结一波
  • github指令
  • javascript 哈希表
  • java正则表式的使用
  • Linux下的乱码问题
  • mac修复ab及siege安装
  • October CMS - 快速入门 9 Images And Galleries
  • Python打包系统简单入门
  • Selenium实战教程系列(二)---元素定位
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • webpack+react项目初体验——记录我的webpack环境配置
  • Zepto.js源码学习之二
  • 从tcpdump抓包看TCP/IP协议
  • 订阅Forge Viewer所有的事件
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 首页查询功能的一次实现过程
  • 微服务入门【系列视频课程】
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我有几个粽子,和一个故事
  • 中文输入法与React文本输入框的问题与解决方案
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 【干货分享】dos命令大全
  • ​iOS实时查看App运行日志
  • #HarmonyOS:基础语法
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $().each和$.each的区别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (差分)胡桃爱原石
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)四层和七层负载均衡的区别