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

来源:互联网 发布:稚优泉水母面膜 知乎 编辑:程序博客网 时间:2024/05/22 08:45

一、解决的问题:

    Strategy模式和Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy模式将逻辑(算法)封装到一个类(contex)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。St a t e 模式也有类似的功能,他们之间的区别将在讨论中给出。

二、Strategy模式的类图


    


三、策略模型案例

举一个例子:一个人想去旅行,旅行的方式有很多种(比如:徒步旅行、乘坐飞机、乘坐大巴...等待)

我们可以从中间抽象出来一个策略算法就是旅行方式,一个应用场景就是人需要应用,代码如下:


#include <iostream>/** * @brief 策略类接口。 * @noteno * @warning no * @seeno */class TravelStrategy{public:    virtual void travel() = 0;};/*** @brief 策略类:乘坐公共汽车旅行的一种策略类。* @noteno* @warning no* @seeno*/class Bustravel : public TravelStrategy{public:    Bustravel();    ~Bustravel();    virtual void travel();private:};Bustravel::Bustravel(){}Bustravel::~Bustravel(){}void Bustravel::travel(){    std::cout << "BusTravel..." << std::endl;}/** * @brief 策略类:徒步旅行的一种策略类。 * @noteno * @warning no * @seeno */class Walktravel : public TravelStrategy{public:    Walktravel();    ~Walktravel();    virtual void travel();};Walktravel::Walktravel(){}Walktravel::~Walktravel(){}void Walktravel::travel(){    std::cout << "WalkTravel..." << std::endl;}/** * @brief 上述contex类一个旅行者类。 * @noteno * @warning no * @seeno */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...
请按任意键继续. . .

四、总结

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



0 0
原创粉丝点击