23种设计模式之命令模式(Command)
命令模式是一种对象的行为型模式,类似于传统程序设计方法中的回调机制,它将一个请求封装为一个对象,从而使得可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是对命令的封装,将发出命令的责任和执行命令的责任分割开,委派给不同的对象,以实现发送者和接收者完全解耦,提供更大的灵活性和可扩展性。
优点:
1)将调用操作的对象与知道如何完成该操作的对象相分离。
2)更容易添加新命令,因为不用修改已有类。
使用场景:
1)想要通过要执行的动作来参数化对象。
2)要在不同的时间指定、排序以及执行请求。
3)必须支持Undo、日志记录或事务。

Command 模式
/// <summary>
/// 电灯类
/// </summary>
public class Light
{
/// <summary>
/// 调整灯光亮度,0表示关灯,100表示亮度最大
/// </summary>
/// <param name="degree"></param>
public void TurnLight(int degree)
{
if (degree == )
{
Console.WriteLine("关灯");
}
else
{
Console.WriteLine("开灯了,度数为:" + degree);
}
}
}
/// <summary>
/// 电视机类
/// </summary>
public class TV
{
/// <summary>
/// 0表示关机,1表示开机并切换到1频道
/// </summary>
/// <param name="channel"></param>
public void SetChannel(int channel)
{
if (channel == )
{
Console.WriteLine("关机");
}
else
{
Console.WriteLine("表示开机并切换到" + channel + "频道");
}
}
}
/// <summary>
/// 命令接口
/// </summary>
public interface Command
{
/// <summary>
/// 打开
/// </summary>
void On(); /// <summary>
/// 关闭
/// </summary>
void Off();
}
/// <summary>
/// 遥控器类
/// </summary>
public class RemoteController
{
//遥控器有4个按钮,按照编号分别对应4个Command对象
protected Command[] commands = new Command[]; public void OnPressButton(int button)
{
//按钮被按下时执行命令对象中的命令
if (button % == )
{
commands[button].On();
}
else
{
commands[button].Off();
}
} public void SetCommand(int button, Command command)
{
commands[button] = command;//设置每个按钮对象的命令对象
}
}
/// <summary>
/// 电灯命令类
/// </summary>
public class LightCommand : Command
{
protected Light light;
public void On()
{
light.TurnLight();//打开最大
} public void Off()
{
light.TurnLight();//打开最低
} public LightCommand(Light light)
{
this.light = light;
}
}
/// <summary>
/// 电视机命令类
/// </summary>
public class TVCommand : Command
{
protected TV tv;
public void On()
{
tv.SetChannel();
} public void Off()
{
tv.SetChannel();
} public TVCommand(TV tv)
{
this.tv = tv;
}
}
class Program
{
static void Main(string[] args)
{
//命令设计模式
Light light = new Light();
TV tv = new TV(); LightCommand lightCommand = new LightCommand(light);
TVCommand tvCommand = new TVCommand(tv); RemoteController remoteController = new RemoteController();
remoteController.SetCommand(, lightCommand);
remoteController.SetCommand(, lightCommand);
remoteController.SetCommand(, tvCommand);
remoteController.SetCommand(, tvCommand); remoteController.OnPressButton();//按下按钮2
}
}

23种设计模式之命令模式(Command)的更多相关文章
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- 【Unity与23种设计模式】命令模式(Command)
GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- 实践GoF的23种设计模式:建造者模式
摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...
- 23种设计模式 - 行为变化(Command - Visitor)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 行为变化 Command 动机(Motivation) 在软件构建过程中,"行为请求者" ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- JAVA开发的23种设计模式之 --- 桥接模式
桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构. 应用场景 实现系统可能有多 ...
随机推荐
- VIM技巧:选择文本块
在正常模式下(按ESC进入)按键v进入可视化模式,然后按键盘左右键或h,l键即可实现文本的选择.其它相关命令:v:按字符选择.经常使用的模式,所以亲自尝试一下它. V:按行选择.这在你想拷贝或者移动很 ...
- Oralce SQLPlus 以及shell脚本中spool输出到文件时的格式化输出
http://blog.csdn.net/gyanp/article/details/7903056 1) 格式调整有以下参数 set echo on/off ...
- SDK Manager.exe和AVD Manager.exe缺失,Android SDK Tools在检查java环境时卡住了,未响应卡死!
之前安装Android Studio的时候根据提示安装了Android SDK,但是发现目录下没有SDK Manager.exe和AVD Manager.exe,导致SDK的一些操作很不方便! 不知道 ...
- 获取微信小程序源码
https://blog.csdn.net/aaron9185/article/details/80576183 http://lrdcq.com/me/read.php/66.htm https:/ ...
- Get started with ros -- 1
原创博文:转载请标明出处(周学伟):http://www.cnblogs.com/zxouxuewei/tag/ 一.Introduction: 机器人操作系统(ROS)是使机器人系统的不同部分能够发 ...
- [Bayesian] “我是bayesian我怕谁”系列 - Exact Inference
要整理这部分内容,一开始我是拒绝的.欣赏贝叶斯的人本就不多,这部分过后恐怕就要成为“从入门到放弃”系列. 但,这部分是基础,不管是Professor Daphne Koller,还是统计学习经典,都有 ...
- js循环异常
1.当在循环数组时,数组发生变化,循环item 为定义undifined $.each(blogMng.commonKit.upLoadMng.medias, function (index, ite ...
- win7+ oracle +php环境的搭建
http://blog.csdn.net/chchmlml/article/details/6887326 先下载个wmpp1.7.5(之前在xp上也是这个,所以就继续),安装,一切顺利,打开phpi ...
- 判断元素是否存时,使用isset会比in_array快得多
情境 有时候,我们需要判断一个元素是否存在于已有数据中(以此来获得非重复值),这时候,使用isset来判断会比in_array快得多很多!! 测试 1)准备测试数据 $exists_a = []; $ ...
- WAF Bypass FUZZ小脚本
分享两个小脚本,用来WAF Bypass简单FUZZ的 第一个:先生成一个字典,带入搭建的环境进行FUZZ,针对某些软WAF挺好用的,可FUZZ出不少姿势出来,记得先把CC攻击加入白名单才行哦... ...