行为模型-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...
请按任意键继续. . .

四、总结

策略模式是一种定义算法家族的方法,从概念上说所有算法都是为了实现同样的目的,只是实现不同而已。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值