命令模式又称为行动(Action)模 式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象.

每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许

请求的一方和接收的一方独立开来,使 得 请 求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

命令模式类图:

命令模式涉及到五个角色,它们分别是:
  • 客户(Client)角色:创建了一个具体命令 (ConcreteCommand)对象并确定其接收者。

  • 命令(Command)角色:声明了一个给所有具体命令类 的抽象接口。这是一个抽象角色。

  • 具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现 Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执方法。

  • 请求者(Invoker)角色:负责调用命令对象执行请求, 相关的方法叫做行动方法。

  • 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

示例代码:

class Program
{
static void Main(string[] args)
{
Receiver r = new Receiver();
Command command = new ConcreteCommand(r);
Invoker i = new Invoker();
i.SetCommand(command);
i.ExecuteCommand();
Console.ReadKey();
}
} abstract class Command
{
protected Receiver receiver;
public Command(Receiver receiver)
{
this.receiver = receiver;
}
abstract public void Execute();
} class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver)
: base(receiver)
{ }
public override void Execute()
{
receiver.Action();
}
} class Receiver
{
public void Action()
{
Console.WriteLine("Called Receiver.action()"); }
} class Invoker
{
private Command command;
public void SetCommand(Command command)
{
this.command = command;
} public void ExecuteCommand()
{
command.Execute();
}
}

运行结果:

在下面的情况下应当考虑使用命令模式:
  1、使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数 登记上,然后在以后调用此函数。
  2、需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,

    而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也 可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。
  3、系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命 令所产生的效果时,可以调用 undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供 redo()方法,以供客户端在需要时,再重新实施命令效果。
  4、如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读 回所有的数据更新命令,重新调用 Execute()方法一条一条执行这些命令,从而恢复系统在崩 溃前所做的数据更新。
  5、一个系统需要支持交易(Transaction)。一个交易结构封装了一组数据更新命令。使用命令 模式来实现交易结构可以使系统增加新的交易类型。

使用命令模式的优点和缺点
命令允许请求的一方和接收请求的一方能够独立演化,从而且有以下的优点:
  • 命令模式使新的命令很容易地被加入到系统里。

  • 允许接收请求的一方决定是否要否决(Veto)请求。

  • 能较容易地设计-个命令队列。

  • 可以容易地实现对请求的Undo 和 Redo。

  • 在需要的情况下,可以较容易地将命令记入日志。

  • 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

  • 命令类与其他任何别的类一样,可以修改和推广。

  • 你可以把命令对象聚合在一起,合成为合成命令。比如宏命令便是合成命令的例子。合 成命令是合成模式的应用。

  • 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
命令模式的缺点如下:
  • 使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个 甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。

十五、命令(Command)模式--行为型模式(Behavioral Pattern)的更多相关文章

  1. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  2. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  3. C#设计模式之十五命令模式(Command Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command P ...

  4. 设计模式(十四):Command命令模式 -- 行为型模式

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

  5. 设计模式学习之命令模式(Command,行为型模式)(12)

    一.命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能 ...

  6. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

  7. 悟空模式-java-原型模式

    [却说那妖精与大圣斗经半日,不分胜败.行者把棒丢起,叫一声“变!”就以一变十,以十变百,以百变千,半天里,好似蛇游蟒搅,乱打妖邪.妖邪慌了手脚,将身一闪,化道清风,即奔碧空之上逃走.行者念声咒语,将铁 ...

  8. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  9. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  10. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

随机推荐

  1. 开心菜鸟系列学习笔记------------javascript(6)

    一.作用域链            1)函数的生命周期:            函数的生命周期分为创建和激活阶段(调用时),让我们详细研究它.            作用域链与一个执行上下文相关,变量 ...

  2. “假如花千骨在杭州拍摄” 主题Cosplay

    “假如花千骨在杭州拍摄” 主题Cosplay 今天,2015年7月23日,本周三:此刻,现场正在中国杭州西湖举办“花千骨cosplay”大型分享活动,现场有超凡而孤高,冰凉而淡漠 ,温润如玉又云淡风清 ...

  3. Power on & RESET 之前?

    這是個有趣的問題 ? 當應用系統 或 ic元件模組於初始之前存在的現像為何 是個得住意的問題 ! 因為得考量 是否會對週邊或被控制端造成危害 這也是長常常會是不穩定設計 的原因!得有實務經驗及想像力才 ...

  4. qt之窗口换肤(一个qss的坑:当类属性发现变化时需要重置qss,使用rcc资源文件)

    1.相关文章 Qt 资源系统qt的moc,uic,rcc命令的使用 2.概要    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08.10.13等开发工具,并安装了qt的插件,最近在做客户 ...

  5. php将会话保存在数据库里

    php默认把会话保存在临时文件中,保存在数据库中可以提高安全性,在共享主机服务器上,所有web站点都使用同一个临时目录,这意味着数十个程序都在同一位置进行文件读取的操作,我们很容易就编写一个脚本从这个 ...

  6. 利用btrace工具监控在线运行java程序

     一.作用 可以用于对运行中java程序进行诊断监控分析,也可以用于开发阶段查看一些异常信息或者调用过程(如有些第三方代码没有源代码,不便于debug调试). 注:如果用于对在线运行系统的诊断,需 ...

  7. bzoj1753 [Usaco2005 qua]Who's in the Middle

    Description FJ is surveying his herd to find the most average cow. He wants to know how much milk th ...

  8. hdu 1829 A Bug's Life(并查集)

                                                                                                    A Bu ...

  9. awk笔记1

    grep: 文本过滤器    grep 'pattern' input_file ... sed:流编辑器 awk: 报告生成器    格式化以后,显示 AWK a.k.a. Aho, Kernigh ...

  10. Unity调试中心

    渐渐在公司接SDK3个月了,一直没有参加项目的游戏功能编写几乎快忘记Unity了, 看到那些前辈编写游戏到发布游戏,总结了下 每一个游戏应该有一个调试中心, 方便策划 测试更好的了解游戏和测试游戏. ...