设计模式 - Command Pattern(命令模式)
2008-06-21 20:10
721 查看
设计模式 - Command Pattern(命令模式)
设计模式 - Command Pattern(命令模式)
作者:webabcd
介绍
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
示例
有一个Message实体类,某个类对它的操作有Insert()和Delete()方法。现在要求可以对之前的所有操作做撤销和重复。
![](http://www.cnblogs.com/images/cnblogs_com/webabcd/82667/o_Commond.png)
MessageModel
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message实体类
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class MessageModel
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 构造函数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="msg">Message内容</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="pt">Message发布时间</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public MessageModel(string msg, DateTime pt)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._message = msg;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._publishTime = pt;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private string _message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message内容
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
get
![](http://www.cnblogs.com/Images/dot.gif)
{ return _message; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
set
![](http://www.cnblogs.com/Images/dot.gif)
{ _message = value; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private DateTime _publishTime;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message发布时间
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public DateTime PublishTime
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
get
![](http://www.cnblogs.com/Images/dot.gif)
{ return _publishTime; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
set
![](http://www.cnblogs.com/Images/dot.gif)
{ _publishTime = value; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
Action
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// enum
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 定义操作的两种方法Insert和Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public enum Action
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Insert
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Insert,
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SqlMessage
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 接收者(Receiver)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Sql方式操作Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class SqlMessage
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 操作
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public void Operation(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
switch (action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Insert :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Insert(mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Delete :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delete(mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 插入Message
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void Insert(MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 代码略
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 删除Message
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void Delete(MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 代码略
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令(Command)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public interface ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string Execute();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 取消执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string UnExecute();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SqlMessageCommand
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 具体命令(ConcreteCommand)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class SqlMessageCommand : ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 操作的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private Action _action;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message实体对象
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private MessageModel _mm;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 构造函数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public SqlMessageCommand(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._action = action;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._mm = mm;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Execute()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
new SqlMessage().Operation(_action, _mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return _action.ToString() + ":" + _mm.Message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 取消执行(调用一个方法,以决定取消执行的算法)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string UnExecute()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_action = GetUndoAction(_action);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
new SqlMessage().Operation(_action, _mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return _action.ToString() + ":" + _mm.Message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 获得取消执行的算法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns></returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private Action GetUndoAction(Action action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Action undo;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
switch (action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Insert :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Delete;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Delete :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Insert;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 这句没啥用
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
default :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Insert;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return undo;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Message
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 请求者(Invoker)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令集合(保存每次操作)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private List<ICommand> _listCommand = new List<ICommand>();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令集合中当前要执行的命令的索引
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private int current = 0;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行Sql
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Do(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = new SqlMessageCommand(action, mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn = cmd.Execute();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_listCommand.Add(cmd);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
current++;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 撤销
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="levels">执行撤销操作的次数</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Undo(int levels)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 0; i < levels; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (current > 0)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = _listCommand[--current];
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn += cmd.UnExecute() + " ";
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 重复
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="levels">执行重复操作的次数</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Redo(int levels)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 0; i < levels; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (current < _listCommand.Count - 1)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = _listCommand[current++];
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn += cmd.UnExecute() + " ";
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
client
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Data;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Configuration;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.Security;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls.WebParts;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.HtmlControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using Pattern.Command;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public partial class Command : System.Web.UI.Page
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
protected void Page_Load(object sender, EventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Message m = new Message();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第1条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第2条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第3条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第4条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Delete, new MessageModel("第2条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第5条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Delete, new MessageModel("第3条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第6条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第7条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("撤销4次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Undo(4));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("重复2次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Redo(2));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("撤销3次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Undo(3));
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.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条
OK
[源码下载]
设计模式 - Command Pattern(命令模式)
作者:webabcd
介绍
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
示例
有一个Message实体类,某个类对它的操作有Insert()和Delete()方法。现在要求可以对之前的所有操作做撤销和重复。
![](http://www.cnblogs.com/images/cnblogs_com/webabcd/82667/o_Commond.png)
MessageModel
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message实体类
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class MessageModel
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 构造函数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="msg">Message内容</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="pt">Message发布时间</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public MessageModel(string msg, DateTime pt)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._message = msg;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._publishTime = pt;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private string _message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message内容
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
get
![](http://www.cnblogs.com/Images/dot.gif)
{ return _message; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
set
![](http://www.cnblogs.com/Images/dot.gif)
{ _message = value; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private DateTime _publishTime;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message发布时间
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public DateTime PublishTime
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
get
![](http://www.cnblogs.com/Images/dot.gif)
{ return _publishTime; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
set
![](http://www.cnblogs.com/Images/dot.gif)
{ _publishTime = value; }
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
Action
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// enum
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 定义操作的两种方法Insert和Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public enum Action
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Insert
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Insert,
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delete
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SqlMessage
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 接收者(Receiver)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Sql方式操作Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class SqlMessage
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 操作
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public void Operation(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
switch (action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Insert :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Insert(mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Delete :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delete(mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 插入Message
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void Insert(MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 代码略
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 删除Message
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void Delete(MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 代码略
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令(Command)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public interface ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string Execute();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 取消执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string UnExecute();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SqlMessageCommand
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 具体命令(ConcreteCommand)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class SqlMessageCommand : ICommand
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 操作的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private Action _action;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Message实体对象
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private MessageModel _mm;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 构造函数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public SqlMessageCommand(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._action = action;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this._mm = mm;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Execute()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
new SqlMessage().Operation(_action, _mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return _action.ToString() + ":" + _mm.Message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 取消执行(调用一个方法,以决定取消执行的算法)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string UnExecute()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_action = GetUndoAction(_action);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
new SqlMessage().Operation(_action, _mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return _action.ToString() + ":" + _mm.Message;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 获得取消执行的算法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns></returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private Action GetUndoAction(Action action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Action undo;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
switch (action)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Insert :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Delete;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case Action.Delete :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Insert;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 这句没啥用
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
default :
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
undo = Action.Insert;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return undo;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Message
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Text;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Pattern.Command
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 请求者(Invoker)角色
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class Message
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令集合(保存每次操作)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private List<ICommand> _listCommand = new List<ICommand>();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 命令集合中当前要执行的命令的索引
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private int current = 0;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 执行Sql
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="action">操作的方法</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Do(Action action, MessageModel mm)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = new SqlMessageCommand(action, mm);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn = cmd.Execute();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_listCommand.Add(cmd);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
current++;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 撤销
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="levels">执行撤销操作的次数</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Undo(int levels)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 0; i < levels; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (current > 0)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = _listCommand[--current];
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn += cmd.UnExecute() + " ";
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 重复
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="levels">执行重复操作的次数</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns>操作的方法及操作的信息(用空格分开多条记录)</returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Redo(int levels)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string rtn = "";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 0; i < levels; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (current < _listCommand.Count - 1)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICommand cmd = _listCommand[current++];
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rtn += cmd.UnExecute() + " ";
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return rtn;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
client
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Data;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Configuration;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.Security;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls.WebParts;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.HtmlControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using Pattern.Command;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public partial class Command : System.Web.UI.Page
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
protected void Page_Load(object sender, EventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Message m = new Message();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第1条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第2条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第3条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第4条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Delete, new MessageModel("第2条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第5条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Delete, new MessageModel("第3条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第6条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Do(Action.Insert, new MessageModel("第7条", DateTime.Now)));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("撤销4次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Undo(4));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("重复2次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Redo(2));
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("撤销3次操作");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write("<br />");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Response.Write(m.Undo(3));
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.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条
OK
[源码下载]
相关文章推荐
- 设计模式之七 命令模式(Command Pattern)
- 设计模式之命令模式(Command Pattern)
- 设计模式之命令模式(Command Pattern)
- 设计模式读书笔记之命令模式(Command Pattern)
- 设计模式 - 命令模式(command pattern) 多命令 详解
- c++设计模式:命令模式(Command Pattern)
- 设计模式 命令模式(Command Pattern)
- 设计模式学习笔记--命令模式command pattern(Java版)
- Design Pattern Command 命令设计模式
- 设计模式系列3-----C++实现命令模式(Command Pattern)
- 设计模式——命令模式 (Command Pattern)
- Head First 设计模式 (六) 命令模式(Command pattern) C++实现
- 设计模式笔记之命令模式(command Pattern)
- 设计模式15:Command Pattern (命令模式)
- 设计模式笔记8:命令模式(Command Pattern)
- 设计模式之:命令模式(Command Pattern)
- c++设计模式:命令模式(Command Pattern)
- C#设计模式——命令模式(Command Pattern)
- 深入浅出设计模式-006:命令模式(Command Pattern)
- C#设计模式之十四命令模式(Command Pattern)【行为型】