Strategy設計模式舉例。
看圖:
代碼實現:
#include <iostream>using namespace std;class FlyBehavior {
public:virtual void fly() = 0;
};class QuackBehavior {
public:virtual void quack() = 0;
};class FlyWithWings :public FlyBehavior {
public:void fly() { cout << "fly with wings!" << endl; }
};class FlyNoWay :public FlyBehavior {
public:void fly() { cout << "can not fly!" << endl; }
};class Quack :public QuackBehavior {
public:void quack() { cout << "gaga!" << endl; }
};class Squeak :public QuackBehavior {
public:void quack() { cout << "fricktion !" << endl; }
};class QuackNoWay :public QuackBehavior {
public :void quack() { cout << "can not sound!" << endl; }
};class Duck {
protected:FlyBehavior *flyBehavior;QuackBehavior *quackBehavior;
public:void fly() { flyBehavior->fly(); }void quack() { quackBehavior->quack(); }virtual void display() = 0;};class RubberDuck :public Duck {
public:RubberDuck() {flyBehavior = new FlyNoWay;quackBehavior = new Squeak;}void display() { cout <<"rubber duck" << endl; };
};
細節:
- 在Duck類中,new的是虛類(virtual)或者虛方法類,而在RubberDuck中new的是實類。接下來,調用實類的方法時,會根據不同的實類調用不同的實方法。
- new FlyNoWay 也可以寫成new FlyNoWay(),但是最好寫成new FlyNoWay()。
- 結合本例,圖中的聚合/集合該如何理解?