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

优点:

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. Android使用http协议与服务器通信

    网上介绍Android上http通信的文章很多,不过大部分只给出了实现代码的片段,一些注意事项和如何设计一个合理的类用来处理所有的http请求以及返回结果,一般都不会提及.因此,自己对此做了些总结,给 ...

  2. 源码分析一(Iterator、Collection以及List接口)

    1:Iterable接口,实现这个接口的类对象可以进行迭代 package java.lang; import java.util.Iterator; /** * 实现这个接口的类所创建的对象可以进行 ...

  3. 2014-07-08 hibernate tenancy

    http://en.wikipedia.org/wiki/Multitenancy http://www.infoq.com/news/2012/01/hibernate-4-released htt ...

  4. 怎样把网站升级到http/2

    https://juejin.im/post/59c63adf6fb9a00a4c271484

  5. 使用pyinotify实现加强版的linux tail -f 命令,并且对日志类型的文本进行单独优化着色显示。

    tail -f命令不能自动切换切片文件,例如日志是每100M生成一个新文件,tail -f不能自动的切换文件,必须关闭然后重新运行tail -f 此篇使用pyinotify,检测文件更新,并实现tai ...

  6. 8 -- 深入使用Spring -- 4...3 AOP的基本概念

    8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...

  7. DropDownListFor的种种纠结(禁止转载)

    严重禁止转载,好多爬虫软件为了浏览到处抓东西,真缺德 具有键“CorpType”的 ViewData 项属于类型“System.Int64”,但它必须属于类型“IEnumerable<Selec ...

  8. yii中缓存(cache)详解

    缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: 1 ...

  9. flexbox常用布局上下固定,中间滚动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. ajax简单手写了一个猜拳游戏

    使用ajax简单写一个猜拳游戏 HTML代码 <!DOCTYPE HTML> <html lang="en-US"> <head> <me ...