zoukankan      html  css  js  c++  java
  • C++設計模式——策略模式

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

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

    宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。
  • 相关阅读:
    【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number
    【BZOJ】【1026】【SCOI2009】Windy数
    【HDOJ】【3555】Bomb
    【HDOJ】【2089】不要62
    【Ural】【1057】Amount of degrees
    【POJ】【3710】Christmas Game
    【BZOJ】【2940】【POI2000】条纹
    【POJ】【3537】Crosses and Crosses
    【POJ】【2068】Nim
    【POJ】【2960】S-Nim
  • 原文地址:https://www.cnblogs.com/vegetable/p/7624215.html
Copyright © 2011-2022 走看看