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种设计模式之 --- 桥接模式
桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构. 应用场景 实现系统可能有多 ...
随机推荐
- GCT之数学公式(几何部分)
一.平面图形 二.空间几何体
- Android开发学习笔记-实现联网检测程序版本
package com.frank.mobilesafe; import java.io.InputStream; import java.net.HttpURLConnection; import ...
- 英文版Ubuntu18.10安装搜狗输入法过程(图文并茂,亲自尝试!)
英文版Ubuntu18.10安装搜狗输入法过程 过程比较艰辛,折腾了好长的时间,不过最终还是装好了,特记录一下! 首先去搜狗输入法网址下载Linux版本:https://pinyin.sogou.co ...
- 查询SQL阻塞语句
SELECT SPID=p.spid, DBName = convert(CHAR(),d.name), ProgramName = program_name, LoginName = convert ...
- Strict Mode (JavaScript)
摘要: ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个”更好”的JavaScript语言.但目 ...
- 使用monkey技术修改python requests模块
例如请求前和请求后各来一条日志,这样就不需要在自己的每个代码都去加日志了. 其实也可以直接记录'urllib3.connectionpool' logger name的日志. 修改了requests ...
- swift--浮点数转换成整数(四舍五入/直接截断)
1,直接截取小数部分转换成整数 let i = Int(23.52536) print("输出是:\(i)") 2,四舍五入转换成证书 let q = lround(586.565 ...
- vux 使用 loading 组件
1)声明引入Loading import { Loading } from 'vux' 2)在模版底部添加 组件(需要添加到 template>div 标签里) <template> ...
- mssql注入指令
and exists (select * from sysobjects) //判断是否是MSSQL and exists(select * from tableName) //判断某表是否存在..t ...
- Java的I/O操作
一.概述 Java的IO支持通过java.io包下的类和接口来完成,在java.io包下主要有包括输入.输出两种IO流,每种输入输出流又可分为字节流和字符流两大类.从JDK1.4以后,Java在jav ...