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

简介:
[索引页]
[源码下载]


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


作者: webabcd


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


示例
有一个Message实体类,某个类对它的操作有Insert()和Delete()方法。现在要求可以对之前的所有操作做撤销和重复。
 
MessageModel
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Message实体类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class MessageModel 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="msg">Message内容</param> 
InBlock.gif                 /// <param name="pt">Message发布时间</param> 
InBlock.gif                 public MessageModel( string msg, DateTime pt) 
InBlock.gif                { 
InBlock.gif                         this._message = msg; 
InBlock.gif                         this._publishTime = pt; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  string _message; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message内容 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string Message 
InBlock.gif                { 
InBlock.gif                        get {  return _message; } 
InBlock.gif                        set { _message = value; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private DateTime _publishTime; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message发布时间 
InBlock.gif                 /// </summary> 
InBlock.gif                 public DateTime PublishTime 
InBlock.gif                { 
InBlock.gif                        get {  return _publishTime; } 
InBlock.gif                        set { _publishTime = value; } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
Action
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// enum 
InBlock.gif         /// 定义操作的两种方法Insert和Delete 
InBlock.gif         /// </summary> 
InBlock.gif         public  enum Action 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Insert 
InBlock.gif                 /// </summary> 
InBlock.gif                Insert, 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Delete 
InBlock.gif                 /// </summary> 
InBlock.gif                Delete 
InBlock.gif        } 
InBlock.gif}
 
SqlMessage
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 接收者(Receiver)角色 
InBlock.gif         /// Sql方式操作Message 
InBlock.gif         /// </summary> 
InBlock.gif         public  class SqlMessage 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 操作 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="action">操作的方法</param> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 public  void Operation(Action action, MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         switch (action) 
InBlock.gif                        { 
InBlock.gif                                 case Action.Insert :    
InBlock.gif                                        Insert(mm);    
InBlock.gif                                         break
InBlock.gif                                 case Action.Delete : 
InBlock.gif                                        Delete(mm); 
InBlock.gif                                         break
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 插入Message 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 private  void Insert(MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         // 代码略 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 删除Message 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 private  void Delete(MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         // 代码略 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
ICommand
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 命令(Command)角色 
InBlock.gif         /// </summary> 
InBlock.gif         public  interface ICommand 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 执行 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns>操作的方法及操作的信息</returns> 
InBlock.gif                 string Execute(); 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 取消执行 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns>操作的方法及操作的信息</returns> 
InBlock.gif                 string UnExecute(); 
InBlock.gif        } 
InBlock.gif}
 
SqlMessageCommand
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 具体命令(ConcreteCommand)角色 
InBlock.gif         /// </summary> 
InBlock.gif         public  class SqlMessageCommand : ICommand 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 操作的方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 private Action _action; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message实体对象 
InBlock.gif                 /// </summary> 
InBlock.gif                 private MessageModel _mm; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="action">操作的方法</param> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 public SqlMessageCommand(Action action, MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         this._action = action; 
InBlock.gif                         this._mm = mm; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 执行 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns>操作的方法及操作的信息</returns> 
InBlock.gif                 public  string Execute() 
InBlock.gif                { 
InBlock.gif                         new SqlMessage().Operation(_action, _mm); 
InBlock.gif 
InBlock.gif                         return _action.ToString() +  ":" + _mm.Message; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 取消执行(调用一个方法,以决定取消执行的算法) 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns>操作的方法及操作的信息</returns> 
InBlock.gif                 public  string UnExecute() 
InBlock.gif                { 
InBlock.gif                        _action = GetUndoAction(_action); 
InBlock.gif                         new SqlMessage().Operation(_action, _mm); 
InBlock.gif 
InBlock.gif                         return _action.ToString() +  ":" + _mm.Message; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获得取消执行的算法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="action">操作的方法</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 private Action GetUndoAction(Action action) 
InBlock.gif                { 
InBlock.gif                        Action undo; 
InBlock.gif 
InBlock.gif                         switch (action) 
InBlock.gif                        { 
InBlock.gif                                 case Action.Insert :    
InBlock.gif                                        undo = Action.Delete;    
InBlock.gif                                         break
InBlock.gif                                 case Action.Delete : 
InBlock.gif                                        undo = Action.Insert; 
InBlock.gif                                         break
InBlock.gif                                 // 这句没啥用 
InBlock.gif                                 default : 
InBlock.gif                                        undo = Action.Insert; 
InBlock.gif                                         break
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         return undo; 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
Message
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.Command 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 请求者(Invoker)角色 
InBlock.gif         /// </summary> 
InBlock.gif         public  class Message 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 命令集合(保存每次操作) 
InBlock.gif                 /// </summary> 
InBlock.gif                 private List<ICommand> _listCommand =  new List<ICommand>(); 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 命令集合中当前要执行的命令的索引 
InBlock.gif                 /// </summary> 
InBlock.gif                 private  int current = 0; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 执行Sql 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="action">操作的方法</param> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 /// <returns>操作的方法及操作的信息</returns> 
InBlock.gif                 public  string Do(Action action, MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         string rtn = ""; 
InBlock.gif 
InBlock.gif                        ICommand cmd =  new SqlMessageCommand(action, mm); 
InBlock.gif                        rtn = cmd.Execute(); 
InBlock.gif 
InBlock.gif                        _listCommand.Add(cmd); 
InBlock.gif                        current++; 
InBlock.gif 
InBlock.gif                         return rtn; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 撤销 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="levels">执行撤销操作的次数</param> 
InBlock.gif                 /// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns> 
InBlock.gif                 public  string Undo( int levels) 
InBlock.gif                { 
InBlock.gif                         string rtn = ""; 
InBlock.gif 
InBlock.gif                         for ( int i = 0; i < levels; i++) 
InBlock.gif                        { 
InBlock.gif                                 if (current > 0) 
InBlock.gif                                { 
InBlock.gif                                        ICommand cmd = _listCommand[--current]; 
InBlock.gif                                        rtn += cmd.UnExecute() +  " "
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         return rtn; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 重复 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="levels">执行重复操作的次数</param> 
InBlock.gif                 /// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns> 
InBlock.gif                 public  string Redo( int levels) 
InBlock.gif                { 
InBlock.gif                         string rtn = ""; 
InBlock.gif 
InBlock.gif                         for ( int i = 0; i < levels; i++) 
InBlock.gif                        { 
InBlock.gif                                 if (current < _listCommand.Count - 1) 
InBlock.gif                                { 
InBlock.gif                                        ICommand cmd = _listCommand[current++]; 
InBlock.gif                                        rtn += cmd.UnExecute() +  " "
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         return rtn; 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
client
InBlock.gif using System; 
InBlock.gif using System.Data; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Web; 
InBlock.gif using System.Web.Security; 
InBlock.gif using System.Web.UI; 
InBlock.gif using System.Web.UI.WebControls; 
InBlock.gif using System.Web.UI.WebControls.WebParts; 
InBlock.gif using System.Web.UI.HtmlControls; 
InBlock.gif 
InBlock.gif using Pattern.Command; 
InBlock.gif 
InBlock.gif public partial  class Command : System.Web.UI.Page 
InBlock.gif
InBlock.gif         protected  void Page_Load( object sender, EventArgs e) 
InBlock.gif        { 
InBlock.gif                Message m =  new Message(); 
InBlock.gif 
InBlock.gif                Response.Write( "操作"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第1条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第2条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第3条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第4条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Delete,  new MessageModel( "第2条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第5条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Delete,  new MessageModel( "第3条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第6条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Do(Action.Insert,  new MessageModel( "第7条", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif 
InBlock.gif                Response.Write( "撤销4次操作"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Undo(4)); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif 
InBlock.gif                Response.Write( "重复2次操作"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Redo(2)); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif 
InBlock.gif                Response.Write( "撤销3次操作"); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(m.Undo(3)); 
InBlock.gif        } 
InBlock.gif}
 
 
运行结果
操作
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
[源码下载]




     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344545 ,如需转载请自行联系原作者

相关文章
|
3月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
3月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
39 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
11天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1
|
18天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
21 1
|
1月前
|
设计模式 存储 Java
【设计模式】命令模式
【设计模式】命令模式
|
3月前
|
设计模式 Java
设计模式-命令模式
设计模式-命令模式
33 1
|
3月前
|
设计模式 Java
设计模式-命令模式(Command)
设计模式-命令模式(Command)
32 0
|
3月前
|
设计模式 存储 Java
Java设计模式-命令模式
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储、传递、调用、增加与管理。 也就是将发送者、接收者和调用命令封装成独立的对象,来供客户端调用。属于行为模式的一种。
29 1
Java设计模式-命令模式
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——06命令模式
Golang设计模式——06命令模式
20 0
|
3月前
|
设计模式 存储 前端开发
【设计模式】之命令模式
命令模式是一种非常有用的设计模式,在前端开发中经常用于管理和执行操作。它通过将操作封装成对象,并将其作为参数传递、存储或记录,实现了优雅地管理和执行操作。通过使用命令模式,我们可以提高代码的可维护性和可扩展性。然而,在应用命令模式时需要权衡其带来的优缺点,并根据具体情况进行选择。
39 0