深入理解C++之策略模式

2020-01-06 15:27:32丽君
下面小编就为大家带来一篇深入理解C++之策略模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧  

1  会飞的鸭子

  Duck 基类,包含两个成员函数 (swim, display);派生类 MallardDuck,RedheadDuck 和 RubberDuck,各自重写继承自基类的 display 成员函数


class Duck {
public:
  void swim();
  virtual void display();
};

class MallardDuck : public Duck {
public:
  void display(); // adding virtual is OK but not necessary
};

class RedheadDuck ...

现在要求,为鸭子增加会飞的技能 -- fly,那么应该如何设计呢?

1.1  继承

考虑到并非所有的鸭子都会飞,可在 Duck 中加个普通虚函数 fly,则“会飞”的派生类继承 fly 的一个缺省实现,而“不会飞”的派生类重写 fly 的实现


void Duck::fly() { std::cout << "I am flying !" << std::endl; }

void RubberDuck::fly() { std::cout << "I cannot fly !" << std::endl; }

1.2  接口

实际上,使用一般虚函数来实现多态并非良策,在前文 C++11 之 override 关键字中的 “1.2 一般虚函数” 已经有所解释,常用的代替方法是 “纯虚函数 + 缺省实现”,

即将 fly 在基类中声明为纯虚函数,同时写一个缺省实现

因为是纯虚函数,所以只有“接口”会被继承,而缺省的“实现”却不会被继承,是否调用基类里 fly 的缺省实现,则取决于派生类里重写的 fly 函数


void MallardDuck::fly() { Duck::fly(); } 
void RedheadDuck::fly() { Duck::fly(); }

1.3  设计模式

到目前为止,并没有使用设计模式,但问题看上去已经被解决了,实际上使用或不使用设计模式,取决于实际需求,也取决于开发者

<Design Patterns> 中,关于策略模式的适用情景,如下所示:

1)  many related classes differ only in their behavior

2)  you need different variants of an algorithm

3)  an algorithm uses data that clients shouldn't know about

4)  a class defines many behaviors, and these appear as multiple conditional statements in its operations