命令模式是一种对象的行为型模式,类似于传统程序设计方法中的回调机制,它将一个请求封装为一个对象,从而使得可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是对命令的封装,将发出命令的责任和执行命令的责任分割开,委派给不同的对象,以实现发送者和接收者完全解耦,提供更大的灵活性和可扩展性。

优点:

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)的更多相关文章

  1. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  2. 【Unity与23种设计模式】命令模式(Command)

    GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...

  3. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  6. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  7. 23种设计模式 - 行为变化(Command - Visitor)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 行为变化 Command 动机(Motivation) 在软件构建过程中,"行为请求者" ...

  8. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  9. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

随机推荐

  1. [Learn AF3]第五章 App Framework 3组件之Drawer——Side Menu

    Drawer——Side menu 组件名称:Drawer     说明:af3中的side menu和af2中有很大变化,af3中的side menu实际上是通过插件$.afui.drawer来实现 ...

  2. Java读写配置文件——Properties类的简要使用笔记

    任何编程语言都有自己的读写配置文件的方法和格式,Java也不例外. 在Java编程语言中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XM ...

  3. flask with gae开发小结

    最近因为要重写之前发布在GAE上的一个博客,又回顾了一下python,同时,因为用的flask,gae等等,一道写一些小总结,供日后查阅. 1, slugify 其实这个问题可以不考虑,只要你愿意用中 ...

  4. git statsh命令报错解决

    git stash命令主要用于当在一个分支的开发工作未完成,却又要切换到另外一个分支进行开发的时候,除了commit原分支的代码改动的方法外,提供暂存代码的方式. git stash命令参考这篇:ht ...

  5. ABBYY FineReader操作技巧

    使用ABBYY FineReader OCR文字识别软件工作即快速又简单,软件自身常常可以自行处理一切工作,用户只需点击几下软件中的‘主要’按钮.不过,有时要想获得更好的质量结果,或者解决某个不寻常的 ...

  6. 【Postgres】dump数据库备份与还原

    备份 pg_dump.exe -h localhost -p 5432 -U postgres -F plain -v -f C:\Backup.sql db1 2> C:\Backup.log ...

  7. ios的单元測试OCUnit以及更新了之后的XCTestCase

    1.像一般创建项目的步骤一样.创建一个用于測试的项目或者打开一个待測试的项目. (oc是5.0之前所使用的測试,如今用的是XCtestCase,默认会创建一个主的測试类.曾经版本号可能非常多步骤省去) ...

  8. 在Visual Stdio 2012中编译执行JM18.6的方法

    JM是H.264编码的官方实现,与X264开源实现相比,JM的实现比較完整,代码更加规范.并且同一时候提供了编码和解码过程.便于对照分析.可是JM的最大缺点是效率比X264低.因此.非常多应用都基于X ...

  9. Dubbo -- 系统学习 笔记 -- 成熟度

    Dubbo -- 系统学习 笔记 -- 目录 成熟度 功能成熟度 策略成熟度 啦啦啦

  10. HTML开发之(块级标签,行内标签,行内块标签)

    显示模式的特性: 主要分为两大类: 块级元素:独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默认为浏览器的宽度,即就是100%宽: 行内元素:可以多个标签存在一行,对宽高属性值不生效,完全靠内 ...