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种设计模式之 --- 桥接模式
桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构. 应用场景 实现系统可能有多 ...
随机推荐
- 安卓开发笔记——关于AsyncTask的使用
在安卓开发中,我们经常要进行一些耗时操作,比如数据库操作,获取网络资源,读取内存文件等等,当我们在处理这些耗时操作的时候,如果我们直接在UI主线程进行,那么可能会导致阻塞UI主线程,使得UI界面卡顿, ...
- 条理清晰的搭建SSH环境之整合Hibernate和Spring
上篇博客整合了Struts和Spring,感觉很简单,这篇博客主要讲述Hibernate和Spring的整合. 如果说上篇博客中的整合是以为Spring的IOC可以管理对象,让Struts2里的对象管 ...
- WWDC 2015大会到来了
WWDC 2015大会到来了,观看到凌晨3点,困死了. 从现场直播视频可以看到: (1)iOS 9的新体验:Siri更智能.Search更全面.苹果支付更方便.Notes和News更新颖好用.地图应用 ...
- 【Ubuntu】boot空间不足
http://www.linuxidc.com/Linux/2015-05/117401.htm http://www.xitongzhijia.net/xtjc/20150327/43160.htm ...
- 4. Beego 框架之cookie与session
what is cookie? cookie是存储在客户端的,用于标识客户身份的! what is session session 是存储在服务端,也是用于客户身份标识,用于跟踪用户会话. BeeGo ...
- Java加密和C#解密=>DES方法
Java加密代码: import javax.crypto.*; import javax.crypto.*; import java.io.UnsupportedEncodingException; ...
- Linux定时运行程序脚本
项目开发中经常需要用将某个脚本定时运行从而避免其运行并不会影响到其他程序.虽说可以在脚本中利用sleep命令来做这一点,Linux自带了crontab命令可以很好的执行这一操作. 比如我们有名为som ...
- MySQL修改密码和忘记ROOT密码
1.关闭数据库 脚本:[root@mysql etc]# service mysql stop 2.使用脚本: mysqld_safe --skip-grant-tables 启动数据库 使用/usr ...
- [原]单片机/Stm32教程
1 http://www.amobbs.com/forum.php?mod=viewthread&tid=4462962 2.http://bbs.21ic.com/forum.php?mod ...
- [RN] 01 - Init: Try a little bit of React Native
Ref: React Native跨平台移动应用开发 后记:这本书博客味有点浓. 本篇涉及新建工程的若干套路,以及一点语法知识. 创建新工程 (1) 解决的一大核心问题: (2) 使用Javascri ...