- 浏览: 963606 次
- 性别:
- 来自: 魔都
-
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
文章链接:http://ytuwlg.iteye.com/blog/317764
文章链接2:http://www.cnblogs.com/zhenyulu/articles/69858.html
Command 模式 Step by Step
引言
提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式。
我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,通过这个控制器,我们可以控制电器(诸如灯、风扇、空调等)的开 关。我们的控制器上有一系列的按钮,分别对应家中的某个电器,当我们在遥控器上按下“On”时,电器打开;当我们按下“Off”时,电器关闭。
好了,让我们开始Command 模式之旅吧。
HardCoding的实现方式
控制器的实现
一般来说,考虑问题通常有两种方式:从最复杂的情况考虑,也就是尽可能的深谋远虑,设计之初就考虑到程序的可维护性、扩展性;还有就是从最简单的情 况考虑,不考虑扩展,客户要求什么,我们就做个什么,至于以后有什么新的需求,等以后再说。当然这两种方式各有优劣,本文我们从最简单的情况开始考虑。
我们假设控制器只能控制 三个电器,分别是:灯、电扇、门(你就当是电子门好了^^)。那么我们的控制器应该有三组,共六个按钮,每一组按钮分别有“On”,“Off”按钮。同 时,我们规定,第一组按钮对应灯,第二组按钮对应电扇,第三组则对应门,那么控制器应该就像这样:
类的设计
好了,控制器大致是这么个样子了,那么 灯、电扇、门又是什么样子呢?如果你看过前面几节的模式,你可能会以为此时又要为它们创建一个基类或者接口,然后供它们继承或实现。现在让我们先看看我们想要控制的电器是什么样子的:
很抱歉,你遗憾地发现,它们的接口完全不同 ,我们没有办法对它们进行抽象,但是因为我们此刻仅考虑客户最原始的需求(最简单的情况),那么我们大可以直接将它们复合到 遥控器(ControlPanel) 中
NOTE: 关于接口,有狭义的含义:就是一个声明为interface的类型。还有一个广义的含义:就是对象暴露给外界的方法、属性,所以一个抽象类也可以称作一个接口。这里,说它们的接口不同,意思是说:这三个电器暴露给外界的方法完全不同。
注意到,PressOn方法,它代表着某一个按键被按下,并接受一个int类型的参数:SlotNo,它代表是第几个键被按下。显然,SlotNo的取值为0到2。对于PressOff则是完全相同的设计。
代码实现
namespace Command {
// 定义灯
public class Light {
public void TurnOn(){
Console .WriteLine("The light is turned on." );
}
public void TurnOff() {
Console .WriteLine("The light is turned off." );
}
}
// 定义风扇
public class Fan {
public void Start() {
Console .WriteLine("The fan is starting." );
}
public void Stop() {
Console .WriteLine("The fan is stopping." );
}
}
// 定义门
public class Door {
public void Open() {
Console .WriteLine("The door is open for you." );
}
public void Shut() {
Console .WriteLine("The door is closed for safety" );
}
}
// 定义遥控器
public class ControlPanel {
private Light light;
private Fan fan;
private Door door;
public ControlPanel(Light light, Fan fan, Door door) {
this .light = light;
this .fan = fan;
this .door = door;
}
// 点击On按钮时的操作。slotNo,第几个按钮被按
public void PressOn(int slotNo){
switch (slotNo) {
case 0:
light.TurnOn();
break ;
case 1:
fan.Start();
break ;
case 2:
door.Open();
break ;
}
}
// 点击Off按钮时的操作。
public void PressOff(int slotNo) {
switch (slotNo) {
case 0:
light.TurnOff();
break ;
case 1:
fan.Stop();
break ;
case 2:
door.Shut();
break ;
}
}
}
class Program {
static void Main(string [] args) {
Light light = new Light ();
Fan fan = new Fan ();
Door door = new Door ();
ControlPanel panel = new ControlPanel (light, fan, door);
panel.PressOn(0); // 按第一个On按钮,灯被打开了
panel.PressOn(2); // 按第二个On按钮,门被打开了
panel.PressOff(2); // 按第二个Off按钮,门被关闭了
}
}
}
输出为:
The light is turned on.
The door is open for you.
The door is closed for safety
存在问题
这个解决方案虽然能解决当前的问题,但是几乎没有任何扩展性可言。或者说,被调用者(Receiver:灯、电扇、门)与它们的调用者(Invoker:遥控器)是紧耦合的。遥控器不仅需要确切地知道它能控制哪些电器,并且需要知道这些电器由哪些方法可供调用。
如果我们需要调换一下按钮所控制的电器的次序,比如说我们需要让按钮1不再控制灯,而是控制门,那么我们需要修改 PressOn 和 PressOff 方法中的Switch语句。
如果我们需要给遥控器多添一个按钮,以使它多控制一个电器,那么遥控器的字段、构造函数、PressOn、PressOff方法都要修改。
如果我们不给遥控器多添按钮,但是要求它可以控制10个或者电器,换言之,就是我们可以动态分配某个按钮控制哪个电器,这样的设计看上去简直无法完成。
HardCoding 的另一实现
新设计方案
在考虑新的方案以前,我们先回顾前面的设计,第三个问题似乎暗示着我们的遥控器不够好,思考一下,我们发现可以这样设计遥控器:
对比一下,我们看到可以通过左侧可以上下活动的阀门来控制当前遥控器控制的是哪个电器(按照图中当前显示,控制的是灯),在选定了阀门后,我们可以 再通过On,Off按钮来对电器进行控制。此时,我们需要多添一个方法,通过它来控制阀门(进而选择想要控制的电器)。我们管这个方法叫做 SetDevice()。那么我们的设计变成下图所示:
NOTE: 在图中,以及现实世界中,阀门所能控制的电器数总是有限的,但在程序中,可以是无限的,就看你有多少个诸如light的电器类了
注意到几点变化:
因为我们假设遥控器可以控制的电器是无限多的,所以这里不能指定具体电器类型,因为在C#中所有类型均继承自Object,我们将SetDevice()方法接受的参数设置成为Object。
ControlPanel不知道它将控制哪个类,所以图中ControlPanel和Light、Door、Fan没有联系。
PressOn()和PressOff()方法不再需要参数,因为很明显,只有一组On和Off按钮。
代码实现
namespace Command {
public class Light { // 略 }
public class Fan { // 略 }
public class Door { // 略 }
// 定义遥控器
public class ControlPanel {
private Object device;
// 点击On按钮时的操作。
public void PressOn() {
Light light = device as Light;
if (light != null ) light.TurnOn();
Fan fan = device as Fan;
if (fan != null ) fan.Start();
Door door = device as Door;
if (door != null ) door.Open();
}
// 点击Of按钮时的操作。
public void PressOff() {
Light light = device as Light;
if (light != null ) light.TurnOff();
Fan fan = device as Fan;
if (fan != null ) fan.Stop();
Door door = device as Door;
if (door != null ) door.Shut();
}
// 设置阀门控制哪个电器
public void SetDevice(Object device) {
this .device = device;
}
}
class Program {
static void Main(string [] args) {
Light light = new Light ();
Fan fan = new Fan ();
ControlPanel panel = new ControlPanel ();
panel.SetDevice(light); // 设置阀门控制灯
panel.PressOn(); // 打开灯
panel.PressOff(); // 关闭灯
panel.SetDevice(fan); // 设置阀门控制电扇
panel.PressOn(); // 打开门
}
}
}
存在问题
我们首先可以看到,这个方案似乎解决了第一种设计的大多数问题,除了一点点瑕疵:
尽管我们可以控制任意多的设备,但是我们每添加一个可以控制的设备,仍需要修改PressOn()和PressOff()方法。
在PressOn()和PressOff()方法中,需要对所有可能控制的电器进行类型转换,无疑效率低下。
封装调用
问题分析
我们的处境似乎一筹莫展,想不到更好的办法来解决。这时候,让我们先回头再观察一下ControlPanel的PressOn()和PressOff()代码。
// 点击On按钮时的操作。
public void PressOn() {
Light light = device as Light;
if (light != null ) light.TurnOn();
Fan fan = device as Fan;
if (fan != null ) fan.Start();
Door door = device as Door;
if (door != null ) door.Open();
}
我们发现PressOn()和PressOff()方法在每次添加新设备时需要作修改,而实际上改变的是对对象方法的调用,因为不管有多少个if语句,只会调用其中某个不为null的对象的一个方法。 然后我们再回顾一下OO的思想,Encapsulate what varies(封装变化)。我们想是不是应该有办法将这变化的这部分(方法的调用)封装起来呢?
在考虑如何封装之前,我们假设已经有一个类,把它封装起来了,我们管这个类叫做Command,那么这个类该如何使用呢?
我们先考虑一下它的构成,因为它要封装各个对象的方法,所以,它应该暴露出一个方法,这个方法既可以代表 light.TurnOn(),也可以代表fan.Start(),还可以代表door.Open(),让我们给这个方法起个名字,叫做Execute()。
好了,现在我们有了Command类,还有了一个万金油的Execute()方法,现在,我们修改PressOn()方法,让它通过这个Command类来控制电器(调用各个类的方法)。
// 点击On按钮时的操作。
public void PressOn() {
command.Execute();
}
哇,是不是有点简单的过分了!?但就是这么简单,可我们还是发现了两个问题:
Command应该能知道它调用的是哪个电器类的哪个方法,这暗示我们Command类应该保存对于具体电器类的一个引用。
我们的ControlPanel应该有两个Command,一个Command对应于所有开启的操作(我们管它叫onCommand),一个Command对应所有关闭的操作(我们管它叫offCommand)。
同时,我们的SetDevice(object)方法,也应该改成SetCommand(onCommand,offCommand)。好了,现在让我们看看新版ControlPanel 的全景图吧。
Command类型的实现
显然,我们应该能看出:onCommand实体变量(instance variable)和offCommand变量属于Command类型,同时,上面我们已经讨论过Command类应该具有一个Execute()方法, 除此以外,它还需要可以保存对各个对象的引用,通过Execute()方法可以调用其引用的对象的方法。
那么我们按照这个思路,来看下开灯这一操作(调用light对象的TurnOn()方法)的Command对象应该是什么样的:
public class LightOnCommand {
Light light;
public Command(Light light){
this .light = light;
}
public void Execute(){
light.TurnOn();
}
}
再看下开电扇(调用fan对象的Start()方法)的Command对象应该是什么样的:
public class FanStartCommand {
Fan fan;
public Command(Fan fan){
this .fan = fan;
}
public void Execute(){
fan.Start();
}
}
这样显然是不行的,它没有解决任何的问题,因为FanStartCommand和LightOnCommand是不同的类型,而我们的 ControlPanel要求对于所有打开的操作应该只接受一个类型的Command的。但是经过我们上面的讨论,我们已经知道所有的Command都有 一个Execute()方法,我们何不定义一个接口来解决这个问题呢?
OK,现在我们已经完成了全部的设计,让我们先看一下最终的UML图,再进行代码实现吧(简单起见,只加入了灯和电扇)。
我们先看下这张图说明了什么,以及发生的顺序:
ConsoleApplication,也就是我们的应用程序,它创建电器Fan、Light对象,以及LightOnCommand和FanStartCommand。
LightOnCommand、FanStartCommand实现了ICommand接口,它保存着对于Fan和Light的引用,并通过Execute()调用Fan和Light的方法。
ControlPanel复合了Command对象,通过调用Command的Execute()方法,间接调用了Light的TurnOn()方法或者是Fan的Stop()方法。
它们之间的时序图是这样的:
可以看出:通过引入Command对象,ControlPanel对于它实际调用的对象Fan或者Light是一无所知的,它只知道当On按下的时 候就调用onCommand的Execute()方法;当Off按下的时候就调用offCommand的Execute()方法。Light和Fan当然 更不知道谁在调用它。通过这种方式,我们实现了调用者(Invoker,遥控器ControlPanel) 和 被调用者(Receiver,电扇Fan等)的解耦。如果将来我们需要对这个ControlPanel进行扩展,只需要再添加一个实现了ICommand 接口的对象就可以了,对于ControlPanel无需做任何修改。
代码实现
namespace Command {
// 定义空调,用于测试给遥控器添新控制类型
public class AirCondition {
public void Start() {
Console .WriteLine("The AirCondition is turned on." );
}
public void SetTemperature(int i) {
Console .WriteLine("The temperature is set to " + i);
}
public void Stop() {
Console .WriteLine("The AirCondition is turned off." );
}
}
// 定义Command接口
public interface ICommand {
void Execute();
}
// 定义开空调命令
public class AirOnCommand : ICommand {
AirCondition airCondition;
public AirOnCommand(AirCondition airCondition) {
this .airCondition = airCondition;
}
public void Execute() { //注意,你可以在Execute()中添加多个方法
airCondition.Start();
airCondition.SetTemperature(16);
}
}
// 定义关空调命令
public class AirOffCommand : ICommand {
AirCondition airCondition;
public AirOffCommand(AirCondition airCondition) {
this .airCondition = airCondition;
}
public void Execute() {
airCondition.Stop();
}
}
// 定义遥控器
public class ControlPanel {
private ICommand onCommand;
private ICommand offCommand;
public void PressOn() {
onCommand.Execute();
}
public void PressOff() {
offCommand.Execute();
}
public void SetCommand(ICommand onCommand,ICommand offCommand) {
this .onCommand = onCommand;
this .offCommand = offCommand;
}
}
class Program {
static void Main(string [] args) {
// 创建遥控器对象
ControlPanel panel = new ControlPanel ();
AirCondition airCondition = new AirCondition (); //创建空调对象
// 创建Command对象,传递空调对象
ICommand onCommand = new AirOnCommand (airCondition);
ICommand offCommand = new AirOffCommand (airCondition);
// 设置遥控器的Command
panel.SetCommand(onCommand, offCommand);
panel.PressOn(); //按下On按钮,开空调,温度调到16度
panel.PressOff(); //按下Off按钮,关空调
}
}
}
Command 模式
实际上,我们上面做的这一切,实现了另一个设计模式:Command模式。现在又到了给出官方定义的时候了。每次到了这部分我就不知道该怎么写了,写的人太多了,资料也太多了,我相信你看到这里对Command模式已经比较清楚了,所以我还是一如既往地从简吧。
Command模式的正式定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
它的 静态图 是这样的:
它的 时序图 是这样的:
可以和我们前面的图对比一下,对于这两个图,除了改了个名字外基本没变,我就不再说明了,也留给你一点思考的空间。
总结
本文简单地介绍了GOF的Commmand模式,我们通过一个简单的范例家电遥控器 实现了这一模式。
我们首先了解了不使用此模式的HardCoding方式的实现方法,讨论了它的缺点;然后又换了另一种改进了的实现方法,再次讨论了它的不足。 然后,我们通过将对象的调用封装到一个Command对象中的方式,巧妙地完成了设计。最后,我们给出了Command模式的正式定义。
本文仅仅简要介绍了Command模式,它的高级应用:取消操作(UnDo)、事务支持(Transaction)、队列请求(Queuing Request) 以后有时间了会再写文章。
希望这篇文章能对你有所帮助!
http://www.tracefact.net/Design-Pattern/Command.aspx
分享到:
sql 关联查询 | js 延时设置焦点
2009-01-17 11:22浏览 379评论(2)收藏相关推荐
评论
2 楼 ytuwlg 2010-08-17 引用
mingjian01 写道
拜读了大作,感觉你写通俗易懂,看起来很舒服。最近在看command模式,不是很明白command模式和listener模式有什么明显一点的差点,希望向你讨教一下。
比如你这里的例子也可以写成
// 定义Listener接口
public interface IControlListener {
public void pressOn();
public void pressOff();
}
// 定义开空调监听器
public class AirOnCommand : IControlListener {
AirCondition airCondition;
public AirListener(AirCondition airCondition) {
this .airCondition = airCondition;
}
public void pressOn() {
airCondition.Start();
airCondition.SetTemperature(16);
}
public void pressOff(){
airCondition.Stop();
}
}
public class ControlPanel {
private ArrayList<IControlListener> controlListener=new ArrayList<IControlListener>();
public void PressOn() {
.........
for(ControlListener listener:controlListener)
listener.pressOn();
}
public void PressOff() {
.........
for(ControlListener listener:controlListener)
listener.pressOff();
}
public void addListener(IControlListener listener) {
controlListener.add(listener);
}
}
不知道你认为两者的主要区别在于什么地方呢,谢谢~
首先说明,此文非原创,文章结尾附有出处连接;
listener 是 observer 模式的一种实现方式,来看一下 observer 和 command 的定义,也就是它们的intent;
Observer Pattern defines the way a number of classes can be notified of a change.
command pattern encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
第一从上面可以看出它们的intent是不同的;
第二它们的class structure 也不同,这个你可以自己找资料对比一下;拿你贴的代码看(注释)
引用
Java代码
public class ControlPanel {
private ArrayList<IControlListener> controlListener=new ArrayList<IControlListener>(); // a number of classes
public void PressOn() {
.........
for(ControlListener listener:controlListener)
listener.pressOn(); //notified when something change
}
文章中代码
引用
Java代码
public class ControlPanel {
private ICommand onCommand; //encapsulate a request as an object
private ICommand offCommand;
public void PressOn() {
onCommand.Execute(); //delegate operation to command object
}
public void PressOff() {
offCommand.Execute();
}
//控制类中通过此method,依据不同的client parameter 设置command object
public void SetCommand(ICommand onCommand,ICommand offCommand) {
this .onCommand = onCommand;
this .offCommand = offCommand;
}
}
1 楼 mingjian01 2010-08-10 引用
拜读了大作,感觉你写通俗易懂,看起来很舒服。最近在看command模式,不是很明白command模式和listener模式有什么明显一点的差点,希望向你讨教一下。
比如你这里的例子也可以写成
// 定义Listener接口
public interface IControlListener {
public void pressOn();
public void pressOff();
}
// 定义开空调监听器
public class AirOnCommand : IControlListener {
AirCondition airCondition;
public AirListener(AirCondition airCondition) {
this .airCondition = airCondition;
}
public void pressOn() {
airCondition.Start();
airCondition.SetTemperature(16);
}
public void pressOff(){
airCondition.Stop();
}
}
public class ControlPanel {
private ArrayList<IControlListener> controlListener=new ArrayList<IControlListener>();
public void PressOn() {
.........
for(ControlListener listener:controlListener)
listener.pressOn();
}
public void PressOff() {
.........
for(ControlListener listener:controlListener)
listener.pressOff();
}
public void addListener(IControlListener listener) {
controlListener.add(listener);
}
}
不知道你认为两者的主要区别在于什么地方呢,谢谢~
发表评论
-
关于Java 23种设计模式的有趣见解
2013-08-10 18:01 1024关于Java 23种设计模式的有趣见解 [来源] 51CT ... -
Java中常用的设计模式(转)
2013-01-30 12:30 1124下面是我对一些常用设计模式的理解: 模式分为:行为模 ... -
工厂模式,抽象工厂模式,简单工厂的区别
2012-10-10 21:35 9631.抽象工厂模式与工厂方法模式的最大区别就在于,工 ... -
java设计模式之常用设计模式分析
2012-06-05 09:09 1286常用的设计模式有:工厂模式(工厂方法模式,简单工厂模式, ... -
java设计模式之责任链模式(行为模式 )
2012-06-04 14:31 1125(11).责任链模式: 文章链接:http:// ... -
java设计模式之观察着模式(行为模式)
2012-06-04 14:28 1000(10).观察着模式Observer 文章链接:ht ... -
java设计模式之适配器模式(结构型模式)
2012-06-04 14:26 679(9).适配器模式 文章链接:http://chjl2 ... -
java设计模式之动态代理模式(结构型模式)
2012-06-04 14:24 1175(8).代理模式: 文章 ... -
java设计模式之代理模式(结构型模式)
2012-06-04 14:22 1061(8).代理模式: ... -
java设计模式之——装饰模式结(构型模式)
2012-06-03 19:34 1010三.例子代码:使用装饰 ... -
java设计模式之缺省适配器模式(构型模式)
2012-06-03 19:31 1389缺省适配器模式:文章链接:http://jzinfo.itey ... -
java设计模式之模板方法模式(行为模式 )
2012-06-03 19:03 1141package com.createtype.desginpa ... -
java设计模式之——组合模式(结构型模式 )
2012-06-03 18:24 1355接口的作用是什么?定 ... -
java设计模式之——策略模式(行为模式 )
2012-06-03 16:54 1076文章链接:http://yangguangfu ... -
java设计模式之简单工厂模式(创建型模式)
2012-06-01 00:01 1267/** * ## 具体产品(Con ... -
工厂模式,简单工厂模式,抽象工厂模式三者有什么区别
2012-05-31 23:59 1307文章链接: http://blog.csdn.net/ ... -
java设计模式之抽象工厂模式(创建型模式)
2012-05-31 23:57 1150package com.createtype.desgi ... -
java设计模式之工厂方法模式(创建型模式)
2012-05-31 23:56 959package com.createtype.desg ... -
java设计模式之单例模式(创建型模式)
2012-05-30 17:48 1072单列模式: 优点 ... -
java中设计模式分类
2012-05-01 18:31 1153常用的设计模式有:工厂模式(工厂方法模式,简单工厂模式, ...
相关推荐
### (行为型模式) Command 命令模式 #### 概述 在软件工程领域,设计模式被广泛地应用于解决常见的编程难题。其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的...
### Command命令模式详解 #### 概述 Command命令模式是一种常用的设计模式,属于对象行为型模式之一。它的核心思想在于将请求封装成一个对象,从而让发出请求的对象和执行请求的对象解耦。这种方式有助于实现软件...
Command命令模式是一种面向对象的设计模式,属于行为设计模式,它主要解决了在软件开发中行为请求者与行为实现者之间的紧密耦合问题。这种耦合可能导致系统难以维护和扩展。通过Command模式,我们可以将请求封装为一...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第15节:行为型模式Command命令模式
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,这种模式常用于解耦调用者和接收者,提高代码的灵活...
**命令模式(Command模式)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类...
此外,"Command模式.ppt"和"Command模式.docx"可能包含了对命令模式更深入的理论解释和示例代码,帮助学习者理解其原理和应用。 总之,Command模式通过将操作封装在独立的类中,提高了代码的可读性和可维护性,同时...
命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...
C++实现命令模式时,通常会定义一个Command基类,包含Execute()接口,然后创建多个ConcreteCommand子类,每个子类对应一个具体操作。接收者Receiver类包含实际的操作实现。Invoker类持有一个Command对象的引用,并在...
命令模式的核心概念包括四个角色:客户端(Client)、命令接口(Command Interface)、具体命令(Concrete Command)和接收者(Receiver)。让我们逐一深入理解这些角色: 1. 客户端(Client):客户端是整个系统中...
命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中,命令模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。...
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在IT行业中,命令模式广泛应用于软件架构和系统设计,以提高代码...
在`Command.cpp`这个文件中,我们可以预期会看到关于命令模式的实现。通常,命令模式包含以下关键角色: 1. **Command(命令)接口**:定义一个执行操作的接口。所有具体命令类都实现了这个接口。 2. **Concrete ...
在给定的压缩包文件"command_02"中,可能包含了一些关于命令模式的实例代码或者进一步的解释。通常,这样的文件会展示如何创建命令接口、具体命令类、请求者和接收者类,并演示如何在程序中使用这些类来实现命令模式...
**命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和...
命令模式是设计模式之一,WPF中的命令主要用于处理UI交互,分离用户界面与业务逻辑。命令分为两种类型:依赖属性命令(DependencyProperty-based Commands,如ButtonBase.Command)和实现ICommand接口的自定义命令。...