15.命令模式(Command Pattern)
using System; namespace ConsoleApplication8
{
class Program
{
/// <summary>
/// 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。
/// 但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。
/// 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠]。
/// 这就是本文要说的Command模式。
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Document doc = new Document();
doc.Display();
doc.Undo();
doc.Redo();
Console.Read();
} /// <summary>
/// 文档类
/// </summary>
public class Document
{
/// <summary>
/// 显示操作
/// </summary>
public void Display()
{
Console.WriteLine("Display");
} /// <summary>
/// 撤销操作
/// </summary>
public void Undo()
{
Console.WriteLine("Undo");
} /// <summary>
/// 恢复操作
/// </summary>
public void Redo()
{
Console.WriteLine("Redo");
}
} /// <summary>
/// 抽象命令
/// </summary>
public abstract class DocumentCommand
{
public Document _document;
public DocumentCommand(Document doc)
{
this._document = doc;
} /// <summary>
/// 执行
/// </summary>
public abstract void Execute();
} /// <summary>
/// 显示命令
/// </summary>
public class DisplayCommand : DocumentCommand
{
public DisplayCommand(Document doc)
: base(doc)
{ } public override void Execute()
{
_document.Display();
}
} /// <summary>
/// 撤销命令
/// </summary>
public class UndoCommand : DocumentCommand
{
public UndoCommand(Document doc)
: base(doc)
{ } public override void Execute()
{
_document.Undo();
}
} /// <summary>
/// 重做命令
/// </summary>
public class RedoCommand : DocumentCommand
{
public RedoCommand(Document doc)
: base(doc)
{ } public override void Execute()
{
_document.Redo();
}
} /// <summary>
/// Invoker角色
/// </summary> public class DocumentInvoker
{
DocumentCommand _discmd;
DocumentCommand _undcmd;
DocumentCommand _redcmd; public DocumentInvoker(DocumentCommand discmd, DocumentCommand undcmd, DocumentCommand redcmd)
{
this._discmd = discmd;
this._undcmd = undcmd;
this._redcmd = redcmd;
} public void Display()
{
_discmd.Execute();
} public void Undo()
{
_undcmd.Execute();
} public void Redo()
{
_redcmd.Execute();
}
}
}
}
15.命令模式(Command Pattern)的更多相关文章
- 设计模式-15命令模式(Command Pattern)
1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- C#设计模式——命令模式(Command Pattern)
一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...
- 设计模式(六):控制台中的“命令模式”(Command Pattern)
今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...
随机推荐
- Android自定义标题栏
预览一下效果: 素材: 新建一个布局title_bar.xml,代码如下: <?xml version="1.0" encoding="utf-8"?&g ...
- 一个按比特位拷贝数据的函数copybits
一个按比特位拷贝数据的函数 没有进行特别的优化.其实还可以在拷贝源开始位置和目标开始位置是2的整数倍位置的时候进行优化. 说明 这个函数用于从src数组首地址跳过sbb个字节,又跳过ssb个比特位,拷 ...
- 5.3(2)----机器人走方格2(CC150)
这道题只需要把障碍点都设为0就可以了. public static int countWays(int[][] map,int x, int y){ if( x < 0 || y < 0) ...
- python项目在windows下运行出现编码错误的解法
在启动文件里面加入 import sysreload(sys) sys.setdefaultencoding('GB2312') 这样在windows下调试运行神马的,就不会报错了. 当然发布时,建议 ...
- ndk学习14: 进程
Linux进程管理 来自为知笔记(Wiz)
- ShellCode框架(Win32ASM编写)
主要方法: 使用宏的一切技巧让编译器 算出代码的长度 有较好的扩充性 include ShellCodeCalc.inc ;>>>>>>>>>&g ...
- 谷歌chrome浏览器和火狐firefox浏览器自带http抓包工具和请求模拟插件
谷歌chrome浏览器自带http抓包工具 chrome://net-internals/ 谷歌chrome浏览器http请求模拟插件:postman 火狐http请求模拟插件:httprequest ...
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- UIWebView内嵌网页 Xcode7.0以后的用法
UIWebView* webPage=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight-64)]; ...
- JQuery 鼠标事件简介
mouseover事件于用户把鼠标从一个元素移动到另外一个元素上时触发,mouseout事件于用户把鼠标移出一个元素时触发. 下面为你详细介绍下jquery中的鼠标事件: (1):click事件:cl ...