设计模式--策略模式

1、策略模式定义

策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到算法的客户。

 

2、策略模式类图


Client:客户端

Context:需要使用不同策略的类

AbstractStrategy:策略类的公共父类

ConcreteStrategy1、ConcreteStrategy2、ConcreteStrategy3:策略类的子类实现

 

3、模式的优缺点及使用情况

       策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了算法类与使用算法类之间的耦合。同时策略模式的Strategy类层次为Context定义了一系列的可重用的算法和行为,继承有助于析取除这些算法中的公共功能。当我们面对不同时间不同流程要对同一数据采用不同的算法操作时,可以考虑用策略模式。

 

4、应用举例

        每到节假日,超市各大卖场都会安排不同程度的促销活动。这些活动五花八门,常见的有折扣型,满额返现等。我们在购物结算时,超市收银台会根据当前的活动状态采用不同的结算策略,这种情况跟策略模式要解决的问题很相似,可以编写如下示意代码:

#include<iostream>
using namespace std;

class SettleAccout{
public:
    virtual double resultAlgorithm(double amount) = 0;
};

class Discount:public SettleAccout{
public:
    virtual double resultAlgorithm(double amount);
};

double Discount::resultAlgorithm(double amount){
    if(amount > 0){
        return amount*0.9;
    }
    return 0;
}

class Reduce:public SettleAccout{
public:
    virtual double resultAlgorithm(double amount);
};

double Reduce::resultAlgorithm(double amount){
    if(amount >= 300){
        return amount-40;
    }else if(amount > 0){
        return amount;
    }
    return 0;
}

class Checkout{
public:
    void setStrategy(SettleAccout* settleAccout);
    double getResult(double amount);
private:
    SettleAccout* settleAccout;
};

void Checkout::setStrategy(SettleAccout* settleAccout){
	this->settleAccout = settleAccout;
}

double Checkout::getResult(double amount){
	return settleAccout->resultAlgorithm(amount);
}

int main(){

    Checkout* checkout = new Checkout();
    checkout->setStrategy(new Discount());
    cout<<"全场九折优惠,买三百,只需付:"<<checkout->getResult(300)<<endl;
    cout<<"********************************"<<endl;
    checkout->setStrategy(new Reduce());
    cout<<"全场满三百返40,买三百,只需付:"<<checkout->getResult(300)<<endl;

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值