原文:乐在其中设计模式(C#) - 命令模式(Command Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 命令模式(Command Pattern)

作者:webabcd





介绍

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。





示例

有一个Message实体类,某个类对它的操作有Insert()和Delete()方法。现在要求可以对之前的所有操作做撤销和重复。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        {

            this._message = msg;

            this._publishTime = pt;

        }



        private string _message;

        /**//// <summary>

        /// Message内容

        /// </summary>

        public string Message

        {

            get { return _message; }

            set { _message = value; }

        }



        private DateTime _publishTime;

        /**//// <summary>

        /// Message发布时间

        /// </summary>

        public DateTime PublishTime

        {

            get { return _publishTime; }

            set { _publishTime = value; }

        }

    }

}

Action

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// enum

    /// 定义操作的两种方法Insert和Delete

    /// </summary>

    public enum Action

    {

        /**//// <summary>

        /// Insert

        /// </summary>

        Insert,



        /**//// <summary>

        /// Delete

        /// </summary>

        Delete

    }

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// 接收者(Receiver)角色

    /// Sql方式操作Message

    /// </summary>

    public class SqlMessage

    {

        /**//// <summary>

        /// 操作

        /// </summary>

        /// <param name="action">操作的方法</param>

        /// <param name="mm">Message实体对象</param>

        public void Operation(Action action, MessageModel mm)

        {

            switch (action)

            {

                case Action.Insert : 

                    Insert(mm); 

                    break;

                case Action.Delete :

                    Delete(mm);

                    break;

            }

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        private void Insert(MessageModel mm)

        {

            // 代码略

        }



        /**//// <summary>

        /// 删除Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        private void Delete(MessageModel mm)

        {

            // 代码略

        }

    }

}

ICommand

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// 命令(Command)角色

    /// </summary>

    public interface ICommand

    {

        /**//// <summary>

        /// 执行

        /// </summary>

        /// <returns>操作的方法及操作的信息</returns>

        string Execute();



        /**//// <summary>

        /// 取消执行

        /// </summary>

        /// <returns>操作的方法及操作的信息</returns>

        string UnExecute();

    }

}

SqlMessageCommand

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// 具体命令(ConcreteCommand)角色

    /// </summary>

    public class SqlMessageCommand : ICommand

    {

        /**//// <summary>

        /// 操作的方法

        /// </summary>

        private Action _action;



        /**//// <summary>

        /// Message实体对象

        /// </summary>

        private MessageModel _mm;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="action">操作的方法</param>

        /// <param name="mm">Message实体对象</param>

        public SqlMessageCommand(Action action, MessageModel mm)

        {

            this._action = action;

            this._mm = mm;

        }



        /**//// <summary>

        /// 执行

        /// </summary>

        /// <returns>操作的方法及操作的信息</returns>

        public string Execute()

        {

            new SqlMessage().Operation(_action, _mm);



            return _action.ToString() + ":" + _mm.Message;

        }



        /**//// <summary>

        /// 取消执行(调用一个方法,以决定取消执行的算法)

        /// </summary>

        /// <returns>操作的方法及操作的信息</returns>

        public string UnExecute()

        {

            _action = GetUndoAction(_action);

            new SqlMessage().Operation(_action, _mm);



            return _action.ToString() + ":" + _mm.Message;

        }



        /**//// <summary>

        /// 获得取消执行的算法

        /// </summary>

        /// <param name="action">操作的方法</param>

        /// <returns></returns>

        private Action GetUndoAction(Action action)

        {

            Action undo;



            switch (action)

            {

                case Action.Insert : 

                    undo = Action.Delete; 

                    break;

                case Action.Delete :

                    undo = Action.Insert;

                    break;

                // 这句没啥用

                default :

                    undo = Action.Insert;

                    break;

            }



            return undo;

        }

    }

}

Message

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Command

{

    /**//// <summary>

    /// 请求者(Invoker)角色

    /// </summary>

    public class Message

    {

        /**//// <summary>

        /// 命令集合(保存每次操作)

        /// </summary>

        private List<ICommand> _listCommand = new List<ICommand>();



        /**//// <summary>

        /// 命令集合中当前要执行的命令的索引

        /// </summary>

;



        /**//// <summary>

        /// 执行Sql

        /// </summary>

        /// <param name="action">操作的方法</param>

        /// <param name="mm">Message实体对象</param>

        /// <returns>操作的方法及操作的信息</returns>

        public string Do(Action action, MessageModel mm)

        {

            string rtn = "";



            ICommand cmd = new SqlMessageCommand(action, mm);

            rtn = cmd.Execute();



            _listCommand.Add(cmd);

            current++;



            return rtn;

        }



        /**//// <summary>

        /// 撤销

        /// </summary>

        /// <param name="levels">执行撤销操作的次数</param>

        /// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>

        public string Undo(int levels)

        {

            string rtn = "";



            ; i < levels; i++)

            {

                )

                {

                    ICommand cmd = _listCommand[--current];

                    rtn += cmd.UnExecute() + " ";

                }

            }



            return rtn;

        }



        /**//// <summary>

        /// 重复

        /// </summary>

        /// <param name="levels">执行重复操作的次数</param>

        /// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>

        public string Redo(int levels)

        {

            string rtn = "";



            ; i < levels; i++)

            {

                )

                {

                    ICommand cmd = _listCommand[current++];

                    rtn += cmd.UnExecute() + " ";

                }

            }



            return rtn;

        }

    }

}

client

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



using Pattern.Command;



public partial class Command : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Message m = new Message();



        Response.Write("操作");

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第1条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第2条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第3条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第4条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Delete, new MessageModel("第2条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第5条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Delete, new MessageModel("第3条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第6条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Do(Action.Insert, new MessageModel("第7条", DateTime.Now)));

        Response.Write("<br />");

        Response.Write("<br />");



        Response.Write("撤销4次操作");

        Response.Write("<br />");

        Response.Write(m.Undo());

        Response.Write("<br />");

        Response.Write("<br />");



        Response.Write("重复2次操作");

        Response.Write("<br />");

        Response.Write(m.Redo());

        Response.Write("<br />");

        Response.Write("<br />");



        Response.Write("撤销3次操作");

        Response.Write("<br />");

        Response.Write(m.Undo());

    }

}

运行结果

操作

Insert:第1条

Insert:第2条

Insert:第3条

Insert:第4条

Delete:第2条

Insert:第5条

Delete:第3条

Insert:第6条

Insert:第7条

撤销4次操作

Delete:第7条 Delete:第6条 Insert:第3条 Delete:第5条

重复2次操作

Insert:第5条 Delete:第3条

撤销3次操作

Insert:第3条 Delete:第5条 Insert:第2条





参考

http://www.dofactory.com/Patterns/PatternCommand.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 命令模式(Command Pattern)的更多相关文章

  1. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  2. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  3. 【UE4 设计模式】命令模式 Command Pattern

    概述 描述 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作. 命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务 ...

  4. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  5. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  6. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  7. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  8. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  9. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

随机推荐

  1. graph driver-device mapper-02driver基本操作

    // 清除thin pool 1.1 func (d *Driver) Cleanup() error { // 停止thin pool err := d.DeviceSet.Shutdown() r ...

  2. currentstyle和getComputedStyle兼容问题

    currentStyle:获取计算后的样式,也叫当前样式.终于样式. 长处:能够获取元素的终于样式,包含浏览器的默认值,而不像style仅仅能获取行间样式,所以更经常使用到. 注意:不能获取复合样式如 ...

  3. jQuery 复制节点的元素实现加入到购物车功能

    描写叙述: 用户点击左边div中的商品,相应商品会自己主动加入到右面的div中,类似电子商城中的加入到购物车功能. 主要用到了jquery中的复制节点功能,基本原理是首先获取点击的元素,然后将对应信息 ...

  4. tolua 有些功能可以用(经过测试)

    tolua 提供几个 C++ 与 Lua 进行数据交换的工具函数. ~~ tolua.type 返回一个 C++ 对象的类型描写叙述字符串. local node = display.newNode( ...

  5. c# Unicode字符串的解码

    前两天工作中遇到个奇怪的问题,一个unicode字符串(即“\uXXXX”形式)变量,调用HttpUtility.UrlDecode解码过后,还是原样,要么就是乱码状态.无奈之下只能自己写一个解码函数 ...

  6. Hama学习总结

    Hama学习笔记 1.       Hama定义 Hama是基于HDFS上的BSP模型实现,其执行不须要MapReduce. 例证例如以下: 在单点调试的Hama系统上,仅仅执行NameNode.Da ...

  7. spring 定义自己的标签 学习

    自己的自定义配置文件spring 在,有时你想要做一些配置信息的数据结构.基于扩展生意做. 首先: 在项目META-INF文件夹中创建两个文件spring.handlers,和spring.shcem ...

  8. Application.mk中APP_ABI 的含义

    我们在编写JNI代码时有一个可选的文件Application.mk ,这个文件你可以不创建,但是有时候是有必要写一个这样的文件的. Application.mk文件用于描述应用程序本身的一些属性信息, ...

  9. vb.net版机房收费——助你学会七层架构(一)

    我自己写机房的时候,看非常多高人的博客,各种的借鉴,当初务必的纠结,如今整个机房敲完了,写这篇博客给大家一个总体上的.简单理解的七层,期望大家看完这篇文章之后,不会这个纠结了. 首先大家得看了我的上一 ...

  10. Emacs经常使用快捷键的注意事项

    一直用VIM,尝试了好几次Emacs都被它"多得像天上的星星"一样的快捷键给吓倒了.这几天最终下定决心再次尝试. 将它的Tutor练习了一下,顺便对经常使用快捷键做了一下笔记,方便 ...