首页 > 其他 > 详细

Design Patterns---- Strategy 模式

时间:2014-03-18 11:48:25      阅读:419      评论:0      收藏:0      [点我收藏+]

设计模式:可复用面向对象软件的基础 书中对 Strategy 模式的定义如下:

定义了一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于它的用户而变化。


案例:设计一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。商场有许多促销的策略,打折,满300减100等。。。

1.  如果采用之前将的工厂模式,可以采用如下的方式编写:

// Last Update:2014-03-17 21:05:53
/**
 * @file cash.h
 * @brief Strategy Pattern
 * @author shoulinjun@126.com
 * @version 0.1.00
 * @date 2014-03-17
 */

#ifndef CASH_H
#define CASH_H

#include <string>
#include <iostream>
#include <sstream>
#include <cmath>

// base class
// define interface
class CashSuper
{
public:
    virtual ~CashSuper() {}
    virtual double acceptCash(double money) = 0;
};

class CashNormal : public CashSuper
{
public:
    double acceptCash(double money){
        return money;
    }
};

class CashRebate : public CashSuper{
public:
    CashRebate(std::string moneyRate = "0.0"){
        std::stringstream s(moneyRate);
        s >> this->moneyRate_;
    }

    double acceptCash(double money){
        return money * moneyRate_; 
    }

private:
    double moneyRate_;
};

class CashReturn : public CashSuper{
public:
    CashReturn(std::string moneyCondition, std::string moneyReturn){
        std::stringstream s(moneyCondition);
        s >> this->moneyCondition_;
        std::stringstream s2(moneyReturn);
        s2 >> this->moneyReturn_;
    }

    double acceptCash(double money){
        if(money >= moneyCondition_){
            money -= std::floor(money / moneyCondition_) * moneyReturn_;
        }
        return money;
    }
private:
    double moneyCondition_, moneyReturn_;
};

// factory class
class CashFactory{
public:
    static CashSuper* createCashSuper(std::string type)
    {
        CashSuper *pCashSuper(NULL);

        if(type == "正常收费"){
            pCashSuper = new CashNormal();
        }
        else if(type == "满300减100"){ 
            pCashSuper = new CashReturn("300", "100");
        }
        else if(type == "打8折"){ 
            pCashSuper = new CashRebate("0.8");
        }
        else{
            return NULL;
        }
        return pCashSuper;
    }
};

#endif  /*CASH_H*/



#include "cash.h"
#include <iostream>
#include "boost/shared_ptr.hpp"
using namespace std;

int main(void)
{
    boost::shared_ptr<CashSuper> pCashSuper(CashFactory::createCashSuper("正常收费"));
    cout << pCashSuper->acceptCash(300) << endl;

    pCashSuper = boost::shared_ptr<CashSuper>(CashFactory::createCashSuper("打8折"));
    cout << pCashSuper->acceptCash(300) << endl;

    pCashSuper = boost::shared_ptr<CashSuper>(CashFactory::createCashSuper("满300减100"));
    cout << pCashSuper->acceptCash(300) << endl;

    return 0;
}



2.  Strategy 模式

策略模式可以减少各种算法类与使用算法类之间的耦合;

简化单元测试,因为每个算法都有自己的类,可以通过自己的接口进行单元测试。

// base class
// define interface
class CashSuper
{
public:
    virtual ~CashSuper() {}
    virtual double acceptCash(double money) = 0;
};

class CashNormal : public CashSuper
{
public:
    double acceptCash(double money){
        return money;
    }
};

class CashRebate : public CashSuper{
public:
    CashRebate(std::string moneyRate = "0.0"){
        std::stringstream s(moneyRate);
        s >> this->moneyRate_;
    }

    double acceptCash(double money){
        return money * moneyRate_; 
    }
private:
    double moneyRate_;
};

class CashReturn : public CashSuper{
public:
    CashReturn(std::string moneyCondition, std::string moneyReturn){
        std::stringstream s(moneyCondition);
        s >> this->moneyCondition_;
        std::stringstream s2(moneyReturn);
        s2 >> this->moneyReturn_;
    }

    double acceptCash(double money){
        if(money >= moneyCondition_){
            money -= std::floor(money / moneyCondition_) * moneyReturn_;
        }
        return money;
    }
private:
    double moneyCondition_, moneyReturn_;
};

class CashContext{
public:
    CashContext(std::string type): pCashSuper_(NULL){
        if(type == "正常收费"){
            pCashSuper_ = new CashNormal;
        }
        else if(type == "满300减100"){ 
            pCashSuper_ = new CashReturn("300", "100");
        }
        else if(type == "打8折"){ 
            pCashSuper_ = new CashRebate("0.8");
        }
        // else
    }

    ~CashContext(){
        if(pCashSuper_)
          delete pCashSuper_;
    }
    
    double GetResult(double money){
        assert(pCashSuper_ != NULL); 
        return pCashSuper_->acceptCash(money);
    }
private:
    CashSuper *pCashSuper_;
    // copy not allowed
    CashContext(const CashContext&);
    CashContext& operator=(const CashContext&);
};


// 客户端使用如下:
    CashContext csuper("满300减100");
    cout << csuper.GetResult(300) << endl; 

 




参考资料:

1. 大话设计模式

2. 设计模式:可复用面向对象软件的基础


Design Patterns---- Strategy 模式,布布扣,bubuko.com

Design Patterns---- Strategy 模式

原文:http://blog.csdn.net/shoulinjun/article/details/21403877

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!