C++设计模式之策略模式

https://blog.csdn.net/u013216156/article/details/95775654

https://blog.csdn.net/u012206617/article/details/88369499

 策略模式:是指定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。使得算法可以独立于使用它的客户而变化,也就是说这些算法所完成的功能是一样的,对外接口是一样的,只是各自实现上存在差异

 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为,比如说A产品类的加法和减法与B产品的加法减法算法不一样。
 如何解决:将这些算法封装成一个一个的类,任意地替换。
 关键代码:实现同一个接口。
 缺点: 1、策略类会增多。

              2、所有策略类都需要对外暴露。

策略模式是指定义一系列的算法,把它们单独封装起来,并且使它们可以互相替换,
使得算法可以独立于使用它的客户端而变化,也是说这些算法所完成的功能类型是一样的,
对外接口也是一样的,只是不同的策略为引起环境角色环境角色表现出不同的行为。

相比于使用大量的if...else,使用策略模式可以降低复杂度,使得代码更容易维护。

缺点:可能需要定义大量的策略类,并且这些策略类都要提供给客户端。

[环境角色]  持有一个策略类的引用,最终给客户端调用。

1、不同人吃饭方式的案例

#include "iostream"
#include "string"

using namespace std;

//定义一个含有虚函数的基类
class Strategy
{
public:
    virtual void eatFood() = 0;
};

class ChinaEatStrategy  : public Strategy
{
    void eatFood()
    {
        cout << "用筷子吃中餐111" << endl;
    }
};

class AmericanEatStrategy  : public Strategy
{
    void eatFood()
    {
        cout << "用刀叉吃西餐2222" << endl;
    }
};

//上下文【这里算法进行归类,对外依然保持一样的接口】
class EatContext
{
private:
    Strategy *EatStrategy;
public:
    EatContext(string type)
    {
        if(type == "china")
        {
          this->EatStrategy = new ChinaEatStrategy();
        }
        else if(type == "american")
        {
        this->EatStrategy = new AmericanEatStrategy();
        }
    }

    void eat()
    {
        EatStrategy->eatFood();
    }
};


int main()
{
    EatContext *context = new EatContext("china");
    context->eat();
    context = new EatContext("american");
    context->eat();

    return 0;
}

2、骑车方式案例 

#include <iostream>
class BikeStrategy{
public:
       virtual void ride() = 0;
};
class Mobike : public BikeStrategy{
    virtual void ride(){
       std::cout <<"骑摩拜11"<< std::endl;
    }
};
class Haro : public BikeStrategy{
       virtual void ride(){
              std::cout <<"骑haro单车"<< std::endl;
       }
};
class Client{
public:
       void setBike(BikeStrategy* bike){
              this->bs = bike;
       }
       void useBike(){
              bs->ride();
       }
private:
       BikeStrategy* bs;
};
int main(){
       Client* c = new Client;
       Mobike* m = new Mobike;
       Haro* h = new Haro;
       c->setBike(m);
       c->useBike();
       c->setBike(h);
       c->useBike();
       return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值