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

结构图:

Command类:

 abstract class Command
{
protected Receiver receiver; public Command(Receiver receiver)
{
this.receiver = receiver;
} public abstract void Execute();
}

Receiver类:

 //接收者
class Receiver
{
public void Execute1()
{
Console.WriteLine("执行命令1");
} public void Execute2()
{
Console.WriteLine("执行命令2");
}
}

ConcreteCommand类:

//具体命令1
class ConcreteCommand1 : Command
{
public ConcreteCommand1(Receiver receiver)
: base(receiver)
{ } public override void Execute()
{
receiver.Execute1(); //执行命令1
}
} //具体命令2
class ConcreteCommand2 : Command
{
public ConcreteCommand2(Receiver receiver)
: base(receiver)
{ } public override void Execute()
{
receiver.Execute2(); //执行命令2
}
}

Invoker类,要求具体命令执行一个请求:

 class Invoker
{
private List<Command> commands=new List<Command> (); public void SetCommand(Command command)
{
commands.Add(command);
} public void ExecuteCommand()
{
foreach (Command command in commands)
{
command.Execute();
}
}
}

客户端调用:

            Receiver receiver = new Receiver();
Command command1 = new ConcreteCommand1(receiver);
Command command2 = new ConcreteCommand2(receiver); Invoker invoker = new Invoker();
invoker.SetCommand(command1);
invoker.SetCommand(command2); invoker.ExecuteCommand();

结果:

应用场景

在下面的情况下应当考虑使用命令模式:

1)使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。

2)需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。

3)系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。

4)如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

最新文章

  1. 【Unity3d】3d网页游戏场景打包与加载
  2. Understand Lambda Expressions in 3 minutes(翻译)
  3. poj 3734 矩阵快速幂+YY
  4. open file 值修改
  5. PHP glob() 函数
  6. 练习PYTHON之GEVENT
  7. WPF DataGrid 行头小三角
  8. [Mac] 使用Mac时的一些技巧
  9. QTableWidget嵌入QpushButton后定位QpushButton
  10. vue实现简单表格组件
  11. Eclipse增强代码提示插件Code Recommenders安装,顺便说说Eclipse插件安装方法
  12. javascript简单介绍(二)
  13. 初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)
  14. time-时间模块
  15. MSSQL2008 数据库展开报错:值不能为空。 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
  16. ubuntu16.04 离线安装docker ce
  17. docker 运行 elasticsearch + kibana
  18. 再谈JavaScript中的闭包
  19. 用Servlet获取表单数据
  20. [转]Java. SqlServer 使用

热门文章

  1. 思维 UVALive 3708 Graveyard
  2. POJ2553 The Bottom of a Graph(强连通分量+缩点)
  3. BZOJ3012 : [Usaco2012 Dec]First!
  4. redis AND memcache
  5. wp7 HubTile
  6. TYVJ P1012 火柴棒等式 Label:枚举
  7. ModelMap和ModelAndView的作用
  8. [转] - SendMessage、PostMessage原理
  9. javascript获取随机数的几种方式
  10. 对于默认 Windows NT 安装的 SID 值