策略模式与简单工厂模式

 昨天用C++实现了《大话》里面的策略模式
开始的时候很迷茫
因为感觉和简单工厂差的不是很多
—————————————————————————————————————————————

http://zh.wikipedia.org/wiki/策略模式

http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html
http://blog.csdn.net/tjb_1216/article/details/5631143
http://topic.csdn.net/u/20080326/17/5f694729-d7a1-4615-8414-344b93a1a9a3.html
先看了几篇帖子 觉得稍稍好像明白点了

不过 帖子里面——

我也不是很明白,不能将简单工厂所创建的对象理解成为策略模式中的各种算法吗,前者和后者都是继承于某一基类,被工厂或Context所创建,有什么区别?

我与楼上有同感,觉得简单工厂中的对象与策略模式中的算法效果相同,策略模式只是在Context(简单模式工厂中的Factory)中添加了执行方法而已。不懂到底有什么区别


介两个老哥的问题我也很费解

看了下原来工厂和策略的代码
我发现两个工厂类(简单工厂、策略工厂)里面有一个不同
简单工厂 返回了一个基类对象的指针
而策略工厂 由于设计的时候就 有基类对象指针这个属性 所以 没有返回值
莫非这点就是设计上的区别??
------------------------------------------------------------------------------------------------------------------
代码(仅工厂段)

简单工厂
class OperationFactoryT
{
public:
    static DataT* Operate(double numA, double numB, char ch);
};

DataT* OperationFactoryT::Operate(double numA, double numB, char ch)
{
    DataT* temp;
    switch(ch)
    {
        case '+':
            temp = new AddT();
            break;
        case '-':
            temp = new SubT();
            break;
        case '*':
            temp = new MulT();
            break;
        case '/':
            temp = new DivT();
            break;
        default:
            cout << "输入错误" << endl << endl;
            break;
    }
    temp->SetnumA(numA);
    temp->SetnumB(numB);
    return temp;
}


策略工厂

class StrategyFactoryT
{
public:
    ~StrategyFactoryT(){delete cash;}
    void Strategy();
    double Getresult(double acceptcash);
private:
    ChargingCashT* cash;
};
void StrategyFactoryT::Strategy()
{
    cout << "请选择收费模式" << endl;
    cout << "1 正常模式 " << endl;
    cout << "2 折扣模式" << endl;
    cout << "3 返利模式 " << endl;
    int select = 1;
    cin >> select;
    switch(select)
    {
        case 1:
            cash = new CashNormalT();
            break;
        case 2:
            cout << "输入折扣 如8折 则输入0.8" << endl;
            double rebate;
            cin >> rebate;
            cash = new CashRebateT(rebate);
            break;
        case 3:
            cout << "输入返利策略 如满300反100 则输入300 100" << endl;
            double base;
            double returncash;
            cin >> base >> returncash;
            cash = new CashReturnT(base,returncash);
            break;
        default:cout << "输入错误 "; break;
    }
}
double StrategyFactoryT::Getresult(double acceptcash)
{
    return cash->AcceptCash(acceptcash);
}


------------------------------------------------------------------------------------------------------------------

另一个老哥


策略模式:定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

简单工厂:将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。
简单工厂严格意义上不是一种设计模式,只能是一种良好的编程习惯。

好像是说策略模式封装的是算法 注重的是算法的一些东西
简单工厂注重的是对象创建(因为会返回一个基类对象的指针)

╮(╯▽╰)╭
大体上我近期就了解这么多了
把策略模式的代码贴上

 

#include <iostream>
#include <cmath>
//#include <windows.h>

using std::cout;
using std::endl;
using std::cin;

class ChargingCashT
{
public:
    virtual double AcceptCash(double acceptcash)=0;
    virtual ~ChargingCashT(){};
};

class CashNormalT:public ChargingCashT
{
public:
    double AcceptCash(double acceptcash);
};

double CashNormalT::AcceptCash(double acceptcash)
{
    return acceptcash;
}


class CashRebateT:public ChargingCashT
{
public:
    CashRebateT(double rebate);
    double AcceptCash(double acceptcash);
private:
    double _moneyRebate;
};
CashRebateT::CashRebateT(double rebate):_moneyRebate(rebate)
{
}
double CashRebateT::AcceptCash(double acceptcash)
{
    return acceptcash * _moneyRebate;
}


class CashReturnT:public ChargingCashT
{
public:
    CashReturnT(double basemoney,double returncash);
    double AcceptCash(double acceptcash);
private:
    double _basemoney;
    double _returncash;
};
CashReturnT::CashReturnT(double basemoney,double returncash):_basemoney(basemoney),_returncash(returncash)
{

}
double CashReturnT::AcceptCash(double acceptcash)
{
    return  acceptcash - floor(acceptcash/_basemoney) * _returncash;
}

class StrategyFactoryT
{
public:
    ~StrategyFactoryT(){delete cash;}
    void Strategy();
    double Getresult(double acceptcash);
private:
    ChargingCashT* cash;
};
void StrategyFactoryT::Strategy()
{
    cout << "请选择收费模式" << endl;
    cout << "1 正常模式 " << endl;
    cout << "2 折扣模式" << endl;
    cout << "3 返利模式 " << endl;
    int select = 1;
    cin >> select;
    switch(select)
    {
        case 1:
            cash = new CashNormalT();
            break;
        case 2:
            cout << "输入折扣 如8折则输入0.8" << endl;
            double rebate;
            cin >> rebate;
            cash = new CashRebateT(rebate);
            break;
        case 3:
            cout << "输入返利策略如满300反100 则输入300 100" << endl;
            double base;
            double returncash;
            cin >> base >> returncash;
            cash = new CashReturnT(base,returncash);
            break;
        default:cout << "输入错误 "; break;
    }
}
double StrategyFactoryT::Getresult(double acceptcash)
{
    return cash->AcceptCash(acceptcash);
}

int main()
{

    StrategyFactoryT one;
    one.Strategy();
    double cash;
    cout << "请输入金额" << endl;
    cin >> cash;
    cout << "应付款: " << one.Getresult(cash) << endl;
    //system("pause");

    return 0;
}



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值