Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1905890
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2012-06-13 09:29:23

目标:一、建立命令队列; 
           二、可以将命令记入日志; 
           三、接收请求的一方可以拒绝;
           四、添加一个新命令类不影响其它类;
           命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开



示例代码:
#include
#include
#include

using namespace std;

//烤肉师傅
class Barbucer
{
public:
    void MakeMutton()
    {
        cout << "烤羊肉" << endl;
    }
   
    void MakeChickenWing()
    {
        cout << "烤鸡翅膀" << endl;
    }
};

//抽象命令类
class Command
{
protected:
    Barbucer* receiver;
public:
    Command(Barbucer* temp)
    {
        receiver = temp;
    }
    virtual void ExecuteCmd()=0;
};

//烤羊肉命令
class BakeMuttonCmd : public Command
{
public:
    BakeMuttonCmd(Barbucer* temp) : Command(temp){}
    virtual void ExecuteCmd()
    {
        receiver->MakeMutton();
    }
};

//烤鸡翅膀
class ChickenWingCmd: public Command
{
public:
    ChickenWingCmd(Barbucer* temp) : Command(temp){}
    virtual void ExecuteCmd()
    {
        receiver->MakeChickenWing();
    }
};

//服务员类
class Waiter
{
protected:
    vector m_commandList;
public:
    void SetCmd(Command* temp)
    {
        m_commandList.push_back(temp);
        cout << "增加订单" << endl;
    }
   
    //通知执行
    void Notify()
    {
    vector::iterator p = m_commandList.begin();
    while(p != m_commandList.end())
    {
        (*p)->ExecuteCmd();
        p++;
    }
    }
};

//客户端
int main()
{
    //店里添加烤肉师傅、菜单、服务员、顾客等
    Barbucer* barbucer = new Barbucer();
    Command* cmd = new BakeMuttonCmd(barbucer);
    Command* cmd2 = new ChickenWingCmd(barbucer);
    Waiter* girl = new Waiter();
   
    //点菜
    girl->SetCmd(cmd);
    girl->SetCmd(cmd2);
   
    //服务员通知
    girl->Notify();
   
    return 0;
}
阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~