行爲模型-Strategy(策略)模式

一、解決的問題:

    Strategy模式和Template 模式要解決的問題是相同(類似)的,都是爲了給業務邏輯(算法)具體實現和抽象接口之間的解耦。Strategy模式將邏輯(算法)封裝到一個類(contex)裏面,通過組合的方式將具體算法的實現在組合對象中實現,再通過委託的方式將抽象接口的實現委託給組合對象實現。St a t e 模式也有類似的功能,他們之間的區別將在討論中給出。

二、Strategy模式的類圖


    


三、策略模型案例

舉一個例子:一個人想去旅行,旅行的方式有很多種(比如:徒步旅行、乘坐飛機、乘坐大巴...等待)

我們可以從中間抽象出來一個策略算法就是旅行方式,一個應用場景就是人需要應用,代碼如下:


#include <iostream>

/**
 * @brief 策略類接口。
 * @note	no
 * @warning no
 * @see		no
 */
class TravelStrategy
{
public:
    virtual void travel() = 0;
};


/**
* @brief 策略類:乘坐公共汽車旅行的一種策略類。
* @note	no
* @warning no
* @see		no
*/
class Bustravel : public TravelStrategy
{
public:
    Bustravel();
    ~Bustravel();

    virtual void travel();
private:

};

Bustravel::Bustravel()
{
}

Bustravel::~Bustravel()
{
}

void Bustravel::travel()
{
    std::cout << "BusTravel..." << std::endl;
}


/**
 * @brief 策略類:徒步旅行的一種策略類。
 * @note	no
 * @warning no
 * @see		no
 */
class Walktravel : public TravelStrategy
{
public:
    Walktravel();
    ~Walktravel();

    virtual void travel();

};

Walktravel::Walktravel()
{
}

Walktravel::~Walktravel()
{
}

void Walktravel::travel()
{
    std::cout << "WalkTravel..." << std::endl;
}


/**
 * @brief 上述contex類一個旅行者類。
 * @note	no
 * @warning no
 * @see		no
 */
class Person
{
public:
    Person(TravelStrategy* pTravelStrategy);
    ~Person();

    void travel();
private:
    TravelStrategy* m_travelStrategy;
};

Person::Person(TravelStrategy* pTravelStrategy)
{
    m_travelStrategy = pTravelStrategy;
}

Person::~Person()
{
    if (m_travelStrategy)
    {
        delete m_travelStrategy;
        m_travelStrategy = NULL;
    }
}

void Person::travel()
{
    if (m_travelStrategy)
    {
        m_travelStrategy->travel();
    }
    else
    {
        std::cout << "cont not set travel stategy..." << std::endl;
    }
}


//客戶端使用
int main(int argc, char* argv[])
{
    Person person(new Walktravel);
    person.travel();

    Person BusPerson(new Bustravel);
    BusPerson.travel();

    return 0;
}

輸出結果:

WalkTravel...
BusTravel...
請按任意鍵繼續. . .

四、總結

策略模式是一種定義算法家族的方法,從概念上說所有算法都是爲了實現同樣的目的,只是實現不同而已。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章