C++设计模式浅识命令模式


本文摘自网络,作者黄舟,侵删。

命令模式(Command)将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

测试用例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

[code]int main(){

    Barbecuer boy;

    BakeChickenWingCommand bakechickenwingcommand1(boy);

    BakeChickenWingCommand bakechickenwingcommand2(boy);

    BakeMuttonCommand bakemuttoncommand1(boy);

    BakeMuttonCommand bakemuttoncommand2(boy);

 

    Waiter girl;

    girl.SetOrder(&bakechickenwingcommand1);

    girl.SetOrder(&bakechickenwingcommand2);

    girl.SetOrder(&bakemuttoncommand1);

    girl.SetOrder(&bakemuttoncommand2);

    girl.Notify();

    girl.CancelOrder(&bakechickenwingcommand2);

    girl.Notify();

 

    return 0;

}

类实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

[code]class Barbecuer{

public:

    void BakeMutton()

    {

        cout << "Meat\n";

    }

    void BakeChickenWing()

    {

        cout << "Chicken\n";

    }

};

 

class Command{

protected:

    Barbecuer receiver;

public:

    Command(){}

    Command(Barbecuer & b) :receiver(b){}

    virtual void ExcuteCommand() = 0;

};

 

class BakeMuttonCommand :public Command{

public:

    BakeMuttonCommand(Barbecuer & b) { receiver = b; }

    void ExcuteCommand(){ receiver.BakeMutton(); }

};

 

class BakeChickenWingCommand :public Command{

public:

    BakeChickenWingCommand(Barbecuer & b) { receiver = b; }

    void ExcuteCommand(){ receiver.BakeChickenWing(); }

};

 

class Waiter{

    list<Command *>orders;

public:

    void SetOrder(Command * comptr);

    void CancelOrder(Command * comptr);

    void Notify();

};

 

void Waiter::SetOrder(Command * comptr){

    orders.push_back(comptr);

    cout << "Add order\n";

}

 

void Waiter::CancelOrder(Command * comptr){

    orders.remove(comptr);

    cout << "Cancel order\n";

}

 

void Waiter::Notify(){

    for each (Command * var in orders){

        var->ExcuteCommand();

    }

}

总结:

较容易的设计一个命令队列;

在需要的情况下,可以较容易地将命令记入日志;

允许接收请求的一方决定是否否决请求;

可以容易地实现对请求的撤销和重做;

由于加进新的命令类不影响其他的类,因为增加新的具体命令类很容易。

命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开


以上就是C++设计模式浅识命令模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!


相关阅读 >>

c++设计模式浅识命令模式

更多相关阅读请进入《C++,设计模式,命令模式》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...