大话设计模式——策略模式(C++实现)

用C++实现了《大话设计模式》中的策略模式(Strategy)


Strategy.h:

#ifndef _STRATEGY_H
#define _STRATEGY_H
#include <iostream>
using namespace std;

class CCashBase
{
public:
	virtual double ReturnMoney(double money)=0;
protected:
private:
};

class CCashNomal : public CCashBase
{
public:
	double ReturnMoney(double money);
protected:
private:
};

class CCRebate : public CCashBase
{
public:
	CCRebate(double rebate):m_dMoneyRebate(rebate){};
	double ReturnMoney(double money);
protected:
private:
	double m_dMoneyRebate;
};

class CCReturn : public CCashBase
{
public:
	CCReturn(double moneyCondition,double moneyReturn)
		:m_dMoneyCondition(moneyCondition),m_dMoneyReturn(moneyReturn){};
	double ReturnMoney(double money);
protected:
private:
	double m_dMoneyCondition,m_dMoneyReturn;
};

//策略模式
class CCashContext1
{
public:
	CCashContext1(CCashBase *cb);
	double GetResult(double money);
protected:
private:
	CCashBase *m_pCB;
};

//策略与简单工厂模式结合
class CCashContext2
{
public:
	CCashContext2(int i);
	double GetResult(double money);
protected:
private:
	CCashBase *m_pCB;
};


#endif

Strategy.cpp:

#include "Strategy.h"
/************************************************************************/
/* CCashNomal类                                                         */
/************************************************************************/
double CCashNomal::ReturnMoney( double money )
{
	return money;
}
/************************************************************************/
/* CCRebate类                                                           */
/************************************************************************/
double CCRebate::ReturnMoney( double money )
{
	return money * m_dMoneyRebate;
}
/************************************************************************/
/* CCReturn类                                                           */
/************************************************************************/
double CCReturn::ReturnMoney( double money )
{
	double result = money;
	if (money >= m_dMoneyCondition)
		result = money - int(money/m_dMoneyCondition) * m_dMoneyReturn;
	return result;

}
/************************************************************************/
/* CCashContext1类                                                      */
/************************************************************************/
CCashContext1::CCashContext1( CCashBase *cb )
{
	m_pCB = cb;
}

double CCashContext1::GetResult( double money )
{
	return m_pCB->ReturnMoney(money);
}
/************************************************************************/
/* CCashContext2类                                                      */
/************************************************************************/
CCashContext2::CCashContext2( int i )
{
	switch(i)
	{
	case 1:
		m_pCB = new CCashNomal;
		break;
	case 2:
		m_pCB = new CCReturn(300,100);
		break;
	case 3:
		m_pCB = new CCRebate(0.8);
		break;
	default:
		m_pCB = new CCashNomal;
	}

}

double CCashContext2::GetResult( double money )
{
	return m_pCB->ReturnMoney(money);
}

#include <iostream>
#include "Strategy.h"
using namespace std;


int main()
{
	//策略模式	
	CCashContext1 *pCT1 = NULL;
	cout<<"请选择折扣:"<<endl;
	cout<<"1.正常"<<endl;
	cout<<"2.满300返100"<<endl;
	cout<<"3.打8折"<<endl;
	int i;
	cin>>i;
	switch (i)
	{
	case 1:
		pCT1 = new CCashContext1(new CCashNomal);
		break;
	case 2:
		pCT1 = new CCashContext1(new CCReturn(300,100));
		break;
	case 3:
		pCT1 = new CCashContext1(new CCRebate(0.8));
		break;
	default:
		pCT1 = new CCashContext1(new CCashNomal);
	}
	cout<<pCT1->GetResult(500)<<endl;

	//策略与简单工厂模式结合
	//客户端只需要认识一个CCashContext2类,耦合更加降低
	CCashContext2 *pCT2 = new CCashContext2(i);
	cout<<pCT2->GetResult(500)<<endl;

	delete []pCT1,pCT2;
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值