模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提取出來進行封裝。我將鴨子的飛行行爲(有的鴨子根本不會飛)和叫法行爲提取出來,定義成飛行的算法族(飛行)。對飛行行爲來說,他的飛行行爲定義為接口(CInterface_Fly),不同的具體飛行方法定義為不同的子類(FlyNoWay、FlyWithWings),都需要實現飛行行爲方法(fly)。鴨子的父類中維護了飛行行爲的指針。在構造具體的鴨子子類(RedHeadDuck)時,將對應的飛行子類傳入,便成實現具體鴨子的飛行行爲。同理,對鴨子的叫法也是一樣的處理,定義成叫法算法組。
模式結構:

源碼:
1 #ifndef CDUCK_H
2 #define CDUCK_H
3 class CInterface_fly;
4 class CInterface_quak;
5
6 class CDuck
7 {
8 public:
9 CDuck();
10 virtual ~CDuck();
11
12 public:
13 virtual void performFly();
14 virtual void performQuak();
15 public:
16 virtual void setFlyBehavior(CInterface_fly* pInterfaceFly);
17 virtual void setQuackBehavior(CInterface_quak* pInterfaceQuak);
18
19 protected:
20 CInterface_fly* m_pInterface_fly;
21 CInterface_quak* m_pInterface_quak;
22
23 };
24
25 #endif // CDUCK_H
1 #include "duck.h"
2 #include <interface_fly.h>
3 #include <interface_quak.h>
4 #include <QDebug>
5 CDuck::CDuck()
6 {
7
8 }
9 CDuck::~CDuck()
10 {
11
12 }
13 void CDuck::setFlyBehavior(CInterface_fly* pInterfaceFly)
14 {
15 m_pInterface_fly = pInterfaceFly;
16 }
17 void CDuck::setQuackBehavior(CInterface_quak* pInterfaceQuak)
18 {
19 m_pInterface_quak = pInterfaceQuak;
20 }
21 void CDuck::performFly()
22 {
23 if(m_pInterface_fly)
24 {
25 m_pInterface_fly->fly();
26 }
27 }
28 void CDuck::performQuak()
29 {
30 if(m_pInterface_quak)
31 {
32 m_pInterface_quak->quak();
33 }
34 }
1 #include <QCoreApplication>
2 #include <redheadduck.h>
3 #include <duck.h>
4 #include "interface_fly.h"
5 #include "interface_quak.h"
6 #include "flywithwings.h"
7 #include "squeak.h"
8 int main(int argc, char *argv[])
9 {
10 QCoreApplication a(argc, argv);
11 CInterface_fly* pInterface_fly = new FlyWithWings();
12 CInterface_quak* pInterface_quak = new Squeak();
13 CDuck* pDuck = new RedHeadDuck();
14 pDuck->setFlyBehavior(pInterface_fly);
15 pDuck->setQuackBehavior(pInterface_quak);
16 pDuck->performFly();
17 pDuck->performQuak();
18 return a.exec();
19 }
源碼下載:http://download.youkuaiyun.com/download/gongchao1212/10006758
參考資料:
HeadFirst 設計模式