1. 程式人生 > >C++設計模式——策略模式

C++設計模式——策略模式

code spa fine 技術分享 pin ati first virtual headfirst

模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。

舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提取出來進行封裝。我將鴨子的飛行行爲(有的鴨子根本不會飛)和叫法行爲提取出來,定義成飛行的算法族(飛行)。對飛行行爲來說,他的飛行行爲定義為接口(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.csdn.net/download/gongchao1212/10006758

參考資料:

HeadFirst 設計模式

C++設計模式——策略模式