13.命令模式



1命令模式的核心内容是:

A:发命令者,与实际不同的是,发命令者要求了实际由谁做菜,烤肉。

B:有两个级别的服务员,一个级别的服务员每次只收集一个命令;另外一类服务员可以同时收集多条命令,最后通知厨子和Barbecuer

2命令模式的作用:通过命令模式可以模拟到餐馆下单,服务员向厨子发命令的这个场景。

3命令模式具体描述

命令模式:命令模式把一个请求或者操作封装到一个对象中。

命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

命令模式允许请求的一方和发送的一方独立开来,

使得请求的一方不必知道接收请求的一方的接口,

更不必知道请求是怎么被接收,

以及操作是否执行,何时被执行以及是怎么被执行的。

系统支持命令的撤消。

 

俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,

她对我有什么指示,就写一张纸条让她弟弟带给我。这不,

她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,

哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,

才请我吃面。”

4.命令模式类图

5.代码:

#include<iostream>

#include
<string>

#include
<list>

 

using
namespace
std;

//命令模式:命令模式把一个请求或者操作封装到一个对象中。

//命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

//命令模式允许请求的一方和发送的一方独立开来,

//使得请求的一方不必知道接收请求的一方的接口,

//更不必知道请求是怎么被接收,

//以及操作是否执行,何时被执行以及是怎么被执行的。

//系统支持命令的撤消。

//

//俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,

//她对我有什么指示,就写一张纸条让她弟弟带给我。这不,

//她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,

//哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,

//才请我吃面。”

 

//接收者执行命令,这里相当于实际干活的人

class
Barbecuer 

{

public:

   
void
bakeMutton()

   
{

       
cout <<
"烤羊肉串"
<< endl;

   
}

   
void
bakeChickenWing()

   
{

       
cout <<
"烤鸡翅"
<< endl;

   
}

};

 

//对某个人下达的命令

class
Command  
//命令基类

{

protected:

   
Barbecuer *receiver;//类的包含

public:

   
Command(Barbecuer
*receiver)//命令接受

   
{

       
this->receiver
= receiver;

   
}

   
//然后执行命令

   
virtual
void
executeCommand() = 0;

};

 

//相当于命令的特化

class
BakeMuttonCommand :public
Command

{

public:

   
BakeMuttonCommand(Barbecuer
*receiver) :Command(receiver)

   
{}

   
void
executeCommand()

   
{

       
receiver->bakeMutton();

   
}

};

 

//命令的特化

class
BakeChikenWingCommand :public
Command

{

public:

   
BakeChikenWingCommand(Barbecuer
*receiver) :Command(receiver)

   
{}

   
void
executeCommand()

   
{

       
receiver->bakeChickenWing();

   
}

};

 

//服务员,这里是当条命令

class
Waiter

{

private:

   
Command *command;

public:

   
void
setOrder(Command
*command)

   
{

       
this->command
= command;

   
}

   
void
notify()

   
{

       
command->executeCommand();

   
}

};

 

//gei多个对象下达命令,下多条命令的情况

class
Waiter2 

{

private:

   
list<Command*>
orders;

public:

   
//下单

   
void
setOrder(Command
*command)

   
{

       
orders.push_back(command);

   
}

   
//取消订单

   
void
cancelOrder(Command
*command)

   
{

   
}

   
//发出通知

   
void
notify()

   
{

       
list<Command*>::iterator
iter =
orders.begin();

       
while (iter
!= orders.end())

       
{

           
(*iter)->executeCommand();

           
iter++;

       
}

   
}

};

 

 

int
main()

{

 

   
Barbecuer *boy
= new
Barbecuer();

   
Command *bm1
= new
BakeMuttonCommand(boy);

   
Command *bm2
= new
BakeMuttonCommand(boy);

   
Command *bc1
= new
BakeChikenWingCommand(boy);

 

   
Waiter2 *girl
= new
Waiter2();

 

   
girl->setOrder(bm1);

   
girl->setOrder(bm2);

   
girl->setOrder(bc1);

 

   
girl->notify();

 

 

   
cin.get();

 

   
return 0;

}

运行结果如下:

时间: 2024-11-10 07:52:24

13.命令模式的相关文章

解读设计模式----命令模式(Command Pattern)

本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx 命令模式意图: GOF 在<设计模式>一书中阐述其意图:"将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作."这里所谓的"不同的请求"也既意味着请求可能发生的变化,是一个可能扩展的功能点. 命令

[Head First设计模式]餐馆中的设计模式——命令模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

经典设计模式——命令模式

    考虑这样一种场景,某个方法需要完成某一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量具体步骤无法确定,必须等到该方法执行时才可以确定.具体一点:假设有个方法需要遍历某个数组的数组元素,但无法确定在遍历数组元素时如何处理这些元素,需要调用该方法时指定具体的处理行为.这个要求看起来有点奇怪:这个方法不仅要求传入参数可以变化,甚至要求方法执行体的代码也可以变化,难道我们能把"处理行为"作为一个参数传入该方法?     很遗憾,Java语言暂时还不支持将代码块作为参数传递给方

JAVA中的命令模式实例教程

命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性化的交流媒介.根据GoF的定义,命令模式是: 通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合. 允许某一个对象的行为的变化是独立于其他对象的. 在企业级应用中,命令模式是非常有用的,它使得多个对象可以相互交流.如果一些对象与另一些对象直接交流,系统组件之间是紧耦合的方式.这种方式导致系统具有更高的可维护性,可扩展的灵活性变得很低.命令模式专注于提供一个调解人介于需要交流的对象之间来帮助完成对象间

第14章 命令模式(Command Pattern)

原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern)       概述         在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实

实例讲解设计模式中的命令模式在iOS App开发中的运用_IOS

命令模式封装一个请求或行为作为一个对象.封装的请求比原的更加灵活,可以在对象之间传递,储存,动态修改,或放入一个队列. 那么让我们简要的说一下命令模式的特点. 它能比较容易地设计一个命令队列: 在需要的情况下,可以较容易地将命令记入日志: 允许接收请求地一方决定是否要否决请求: 可以容易地实现对请求地撤销和重做: 由于加进新地具体命令类不影响其他的类,因此增加新的具体命令类很容易: 把请求一个操作的对象与知道怎么执行一个操作的对象分隔开. 下面给出基本的类结构图: 上面这张图是命令模式的类结构的

设计模式之禅之设计模式-命令模式

一:命令模式的定义        --->命令模式是一个高内聚的模式        --->将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.        --->命令模式的角色                ● Receive接收者角色==>该角色就是干活的角色,命令传递到这里是应该被执行的                ● Command命令角色==>需要执行的所有命令都在这里声明         

【设计模式】—— 命令模式Commond

模式意图 将一个请求封装成一个对象,从而对这个命令执行撤销.重做等操作. 典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo.Redo等等. 另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作.这个机制也是java事件的处理方式. 应用场景 1 命令抽象成对象 2 在不同的时刻,指定或者排队命令 3 支持 Undo或者Redo等操作 4 修改日志,当系统崩溃时,利用修改日志执行撤销 5 原语操作上构造

命令模式

1.什么是命令模式? 命令模式(Commond Pattern):将来自客户端的请求封装为一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节.命令模式的根本目的在于将"请求者"与"实现者"之间解耦. 其实命令模式和其他许多设计模式一样,就是在请求者和实现者中间加一个中间人的角色,来达到解除耦合的目的.通过对中间人的特殊设置,从而形成不同的设计模式,命令模式也不例外.命令模式正是通过一个中间的命令者角色完成请求与实现之间的解耦. 2.命令模式的类图: 命