前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >行为型之策略模式C++实现

行为型之策略模式C++实现

作者头像
用户9831583
发布2022-06-16 15:41:45
1920
发布2022-06-16 15:41:45
举报
文章被收录于专栏:码出名企路

现实需求:实现某种目标存在多种策略可供选择的情况,例如出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。

策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

优点:

  1. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
  2. 提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
  3. 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。

缺点:

  1. 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。

主要角色:

  1. 抽象策略类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境类:持有一个策略类的引用,最终给客户端调用。

具体案例:

这不马上五一快到了吗?小码路和哥哥,姐姐分开出去旅游,分别选择不同的出行方式。

第一步:抽象策略类

代码语言:javascript
复制
#pragma once

#include <iostream>
using namespace std;

class Way
{
    public:
        virtual void TrafficWay()=0;
        virtual ~Way(){};
};

第二步:具体策略类

代码语言:javascript
复制
class ByCar:public Way
{
    public:
        void TrafficWay()
        {
            cout<<"自驾车旅游"<<endl;
        }
};

class ByHighWay:public Way
{
    public:
        void TrafficWay()
        {
            cout<<"乘高铁旅游"<<endl;
        }
};

class ByBus:public Way
{
    public:
        void TrafficWay()
        {
            cout<<"乘公共汽车旅游"<<endl;
        }
};

第三步:不同环境不同策略

代码语言:javascript
复制
#include "ce.h"
#include <memory>

class Travel {
public:
    Travel(Way *way);
    void performWay();

private:
    std::unique_ptr<Way> way_;
};

class GegeTravel : public Travel {
public:
    GegeTravel(Way *way);
};

class DidiTravel : public Travel {
public:
    DidiTravel(Way *way);
};

class WoTravel : public Travel {
public:
    WoTravel(Way *way);
};


Travel::Travel(Way *way)
    :way_(way)
{}



void Travel::performWay()
{
      
    way_->TrafficWay();
}

GegeTravel::GegeTravel(Way *way)
    :Travel(way)
{
     cout<<"我是哥哥"<<endl;
}

DidiTravel::DidiTravel(Way *way)
    :Travel(way)
{
     cout<<"我是弟弟"<<endl;
}

WoTravel::WoTravel(Way *way)
    :Travel(way)
{
    cout<<"我是小码路"<<endl;
}

第四步:客户端

代码语言:javascript
复制
int main()
{
    Way *bycar = new ByCar();
    Way *byhighway = new ByHighWay();
    Way *bybus = new ByBus();

    Travel *travel = new GegeTravel(bycar);
    travel->performWay();
    
    Travel *travel1 = new DidiTravel(byhighway);
    travel1->performWay();
  
    
    Travel *travel2 = new WoTravel(bybus);
    travel2->performWay();
  
}

结果显示:

补充模板实现:

代码语言:javascript
复制
template<typename T>
class Travel
{
    public:
        Travel(){}
        void SelectWay()
        {
            way.TrafficWay();
        }
    private:
        T way;
};

int main()
{
    Travel<ByCar> way_;
    way_.SelectWay();
    
    Travel<ByHighWay> way_1;
    way_1.SelectWay();

    Travel<ByBus> way_2;
    way_2.SelectWay();
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档