设计模式C#实现(十五)——命令模式
意图
将请求封装成一个对象,客户接受请求参数;可以对请求排队或者记录请求日志,以及可以支持撤销操作
适用性
- 抽象出待执行的动作以参数化某对象。命令模式是回调机制的一个面向对象的替代品
- 在不同的时刻指定、排列和执行请求
- 支持取消操作
- 支持修改日志
- 支持事务
结构

实现
使用遥控器,实现对一个灯的远程遥控。灯有开、关两个操作。
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();
}
}
运行结果
效果
- 将调用操作的对象与知道如何实现该操作的对象解耦
- 可以将多个命令装配成一个复合命令
- 增加新的命令无需修改已有的类
参考
设计模式C#实现(十五)——命令模式的更多相关文章
- C#设计模式之十五命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command P ...
- Java设计模式菜鸟系列(十五)建造者模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
- Java 设计模式系列(十五)观察者模式(Observer)
Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...
- .NET设计模式(17):命令模式(Command Pattern)(转)
概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...
- Java 设计模式系列(十)外观模式
Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- C#设计模式之十四命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路 ...
- JS 设计模式五 -- 命令模式
概念 命令模式中的命令(command) 指的是 一个执行某些待定事情的指令. 用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 例子 假设html结构如下: &l ...
随机推荐
- 对于SQL Server,我需要多少内存
经常被问到的一个问题:对于SQL Server,我需要多少内存?这个问题还是有同样的典型的“看情况而定”答案.在今天的文章里,我们来详细看下“看情况而定的”的不同方面. 全新SQL Server安装 ...
- 7.6 数据注解特性--StringLength
StringLength attribute can be applied to a string type property of a class. EF Code-First will set t ...
- WP7 手机软件纪念 - 稍后读软件
在本月换机之际,决定写篇博客纪念一下我在 WP7 手机上开发的一个稍后读软件.这个工具开发完成后,两年间,我的 WP7 手机 80% 的用途,都发挥在了它身上. 这个软件其实是一个离线阅读工具,非常类 ...
- WPF模糊效果(BlurEffect)
<TextBlock Padding="10" Text="设置模糊" FontSize="32" Background=" ...
- 疯狂Android讲义 - 学习笔记(三)
Android的事件处理 3.1 Android提供了两套事件处理机制:基于监听的事件处理.基于回调的事件处理. 3.2 基于监听的事件处理 3.2.1 监听的处理模型 主要涉及三类对象:Event ...
- java.lang.Exception: Could not determine the type of file "smb://zhangsan:123456@10.77.44.222/o/mmfiles_2016/40094/25556/2130.avi".
1. 使用smb协议上传文件 报上述错误 2. 解决方法 开启administrator超级管理员 smb地址改为smb://administrator:123456@10.10.10.10/o/.. ...
- SpringMVC的注解开发入门
1.Spring MVC框架简介 支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器(HttpMessageConverter) 和数据转换.格式化.验证框架无缝集成 ...
- 从零开始学 Java - Spring 使用 Quartz 任务调度定时器
生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...
- Ajax实现简单下拉选项
基本都是固定步骤!主要在JAVASCRIPT和PHP中的操作 1.HTML代码里就只有两个SELECT标签如下: <select id="province"> < ...
- canvas 画圈 demo
html代码: <canvas id="clickCanvas2" width="180" height="180" data-to ...