意图

将请求封装成一个对象,客户接受请求参数;可以对请求排队或者记录请求日志,以及可以支持撤销操作

适用性

  • 抽象出待执行的动作以参数化某对象。命令模式是回调机制的一个面向对象的替代品
  • 在不同的时刻指定、排列和执行请求
  • 支持取消操作
  • 支持修改日志
  • 支持事务

结构

实现

使用遥控器,实现对一个灯的远程遥控。灯有开、关两个操作。

  class Light
{
public void On()
{
Console.WriteLine("light is on");
}
public void Off()
{
Console.WriteLine("light is off");
}
}

首先抽象出操作类或者接口

  public interface ICommand
{
void Execute();
void Undo();//撤销
}

对这开、关两个操作请求进行封装,操作需要一个对象作为初始化参数

 class LightOnCommand : ICommand
{
private Light _light;
public LightOnCommand(Light light)
{
this._light = light;
}
public void Execute()
{
_light.On();
}
public void Undo()
{
_light.Off();
}
}
class LightOffCommand:ICommand
{
private Light _light;
public LightOffCommand(Light light)
{
this._light = light;
}
public void Execute()
{
_light.Off();
}
public void Undo()
{
_light.On();
}
}

遥控器接受请求作为初始化参数

class SimpleRemoteControl
{
private ICommand _onSlot;
private ICommand _offSlot;
private ICommand _lastCommand;//记录最后一次操作请求
public void SetCommand(ICommand onCommand,ICommand offCommand)
{
_onSlot = onCommand;
_offSlot = offCommand;
}
public void OnButtonWasPressed()
{
_onSlot.Execute();
_lastCommand = _onSlot;
}
public void OffButtonWasPressed()
{
_offSlot.Execute();
_lastCommand = _offSlot;
}
public void Undo()
{
_lastCommand.Undo();
}
}

使用封装好的请求对客户(遥控器)进行参数化,使其可以控制灯,也可以封装更多操作,使遥控器可以控制其他物品

 class Program
{
static void Main(string[] args)
{
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
LightOffCommand lightOff = new LightOffCommand(light);
remote.SetCommand(lightOn, lightOff);
remote.OnButtonWasPressed();
remote.OffButtonWasPressed();
remote.Undo();//撤销上一步操作
Console.ReadKey();
}
}

运行结果

效果

  • 将调用操作的对象与知道如何实现该操作的对象解耦
  • 可以将多个命令装配成一个复合命令
  • 增加新的命令无需修改已有的类

参考

  1. 《Head First 设计模式》
  2. 《设计模式》

设计模式C#实现(十五)——命令模式的更多相关文章

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

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

  2. Java设计模式菜鸟系列(十五)建造者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...

  3. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  4. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

  5. Java 设计模式系列(十五)观察者模式(Observer)

    Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...

  6. .NET设计模式(17):命令模式(Command Pattern)(转)

    概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...

  7. Java 设计模式系列(十)外观模式

    Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...

  8. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

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

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

  10. JS 设计模式五 -- 命令模式

    概念 命令模式中的命令(command) 指的是 一个执行某些待定事情的指令. 用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 例子 假设html结构如下: &l ...

随机推荐

  1. PHP数组及简单函数

    PHP函数: 1.简单函数 四要素:返回类型,函数名,参数列表,函数体 function Show() { echo "hello"; } Show(); 运行结果:hellow ...

  2. JS实现返回对象的详细信息

    使用JS有时会需要打印出对象的详细信息,下面方法可以实现: function ShowObjProperty(Obj) { var PropertyList=''; var PropertyCount ...

  3. 微信浏览器是移动端的IE6?微信升级内核后Html5和CSS3兼容性总结

    今年4月,自从微信浏览器X5 升级Blink内核之后,各前端社区一片高潮,仿佛看到了前端er,眼含热泪进而抱头痛头的说:终于可以不用兼容这"移动端的IE6 "了,可以早点回家了!! ...

  4. 【原创】Java编译器对String的优化

    首先看以下的代码: public static void main(String[] arge) { String str1 = new String("1234"); Strin ...

  5. 自己实现简单的AOP(一)简介

    AOP 和 OOP,在我看来是两种相辅相成的技术,作为OOP的补充,AOP 有着自己特殊的应用场景. 假设,我们需要在Service层实现以下几项基本功能: /// <para>1.自动管 ...

  6. javascript超过容器后显示省略号效果(兼容一行或者多行)

    javascript超过容器后显示省略号效果       在实际的项目中,由于文字内容的长度不确定性和页面布局的固定性,难免会出现文字内容超过div(或其他标签,下同)区域的情况,此时比较好的做法就是 ...

  7. JS检查是否支持Storage

    查看效果:http://hovertree.com/code/html5/q69kvsi6.htm 代码: <!DOCTYPE html> <html> <head> ...

  8. 从零开始学Python06作业源码(仅供参考)

    Python Version 2.7x 一,bin目录:程序启动入口 SelectLesson_start.py #!usr/bin/env python # -*- coding:utf-8 -*- ...

  9. 转载:《TypeScript 中文入门教程》 6、命名空间

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变 ...

  10. AbpKernelModule

    PreInitialize IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar()); 增加BasicConventi ...