`
xitong
  • 浏览: 6207564 次
文章分类
社区版块
存档分类
最新评论

设计模式之策略模式学习

 
阅读更多

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

在引出策略模式时,讨论了超市收银系统。可以将各种收费项目抽象成几种操作,比如正常收费、打折、返现、返积分。。。对打折来说,之所以可以这样进行抽象因为各种折扣之间存在着相互的联系,故将其抽象为一种。返现、返积分也类似。

算法本身是一种策略,这些算法可能随时被替换,这就是变化点,而封装变化点是面向对象一种很重要的思维方式。

策略模式是定义了一系列算法的方法,从概念上来看所有这些算法完成相同的工作,只是实现不同。它可以以相同的方式调用所有的算法,减少了各种算法类与使用它的算法类之间的耦合。

看代码:

//收费对象虚基类。

class SuperCashier
{
public:
	double price;
	int num;
public:
	SuperCashier(double price,int num)
	{
		this->price=price;
		this->num=num;

	}
	virtual double getTotalMoney()=0; 

} ;

//正常收费

class Normal:public SuperCashier
{
public:

	double discount;
public:
	Normal(double price,int num)
		:SuperCashier(price,num)
	{

	}
	virtual double getTotalMoney()
	{
		return price*num;
	}

} ;

//打折 
class Discount:public SuperCashier
{
public:

	double discount;
public:
	Discount(double price,int num,double discount)
		:SuperCashier(price,num)
	{
		this->discount=discount;
	}
	virtual double getTotalMoney()
	{
		return price*num*discount;
	}

} ;


//返点 
class ReturnPoint :public SuperCashier
{
public:
	double conditionMoney;
	double point;
public :
	ReturnPoint(double price,double num,double cm,double rp)
		:SuperCashier(price,num),conditionMoney(cm),point(rp)
	{

	} 
	virtual double getTotalMoney()
	{
		double total=price*num;
		if(total>=conditionMoney)
		{
			double n=total/conditionMoney;
			return point*n;

		} 
		return 0;
	} 

};

//返现金
class ReturnMoney:public SuperCashier
{
public:
	double conditionMoney;
	double returnNum;
public:
	ReturnMoney(double price,double num,double cm,double returnNum)
		:SuperCashier(price,num),conditionMoney(cm)
	{
		this->returnNum=returnNum;
	}
	virtual double getTotalMoney()
	{
		double total=num*price;
		if(total>=conditionMoney)
		{
			double n=total/conditionMoney;
			return total-n*returnNum;
		}
	}
} ;


/************************************************************************/
/* 策略模式。                                                             */
/***********************************************************************
class CashContext
{
public:
	SuperCashier*sc;
public:
	CashContext(SuperCashier*sc)
	{
		this->sc=sc;
	}
	double getResult()
	{
		return sc->getTotalMoney();
	}


};
//在客户端进行判断。
int main(int argc,char**argv)
{
	double price;
	double num;
	CashContext *cc; 
	while(1)
	{
		cout<<"1..正常收费。2..打折。3..返点 4..返利"<<endl;
		int ch;


		cin>>ch;getchar();
		switch(ch)
		{
		case 1:
			{
				cin>>price>>num;
				cc=new CashContext(new Normal(price,num));


			}
			break;
		case 2:
			{
				double discount;
				cin>>price>>num>>discount;
				cc=new CashContext(new Discount(price,num,discount));
			}
			break;
		case 3:
			{
				double conditionMoney;
				double returnPoint;
				cin>>price>>num>>conditionMoney>>returnPoint;
				cc=new CashContext(new ReturnPoint(price,num,conditionMoney,returnPoint));
			}
			break;
		case 4:
			{
				double conditionMoney;
				double returnMoney;
				cin>>price>>num>>conditionMoney>>returnMoney;
		           cc=new CashContext(new ReturnMoney(price,num,conditionMoney,returnMoney));
			}
			break;
		default:
			break;
		} 
		cout<<cc->getResult()<<endl;
		delete cc;
	}

	return 0;
}*/


/************************************************************************/
/* 策略模式与简单工厂模式结合,即将在main中的switch循环移到CashContext类中       */
/************************************************************************/
class CashContext
{
public:
	int type;
	double price;
	double num;
	double discount;
	double conditionMoney;
	double ret;
	SuperCashier *sc;
public:
	CashContext(int t,double price,int num,double discount)
		:type(t)
	{
		this->price=price;
		this->num=num;
		this->discount=discount;
		
		sc=NULL;
	}
	CashContext(int t,double price,int num)
		:type(t)
	{
		this->price=price;
		this->num=num;
		sc=NULL;
	}
	CashContext(int t,double price,int num,double conditionMoney,double ret)
		:type(t)
	{
		this->price=price;
		this->num=num;
		this->conditionMoney=conditionMoney;
		this->ret=ret;
		sc=NULL;
	}
	double getResult()
	{
		
		switch(type)
		{
		case 1://正常收费
			{
				sc=new Normal(price,num);
			}
			break;
		case 2://打折
			{
				sc=new Discount(price,num,discount);
			}
			break;
		case 3://返点
			{
				sc=new ReturnPoint(price,num,conditionMoney,ret);
			}
			break;
		case 4://返现
			{
				sc=new ReturnPoint(price,num,conditionMoney,ret);
			}
			break;
		default:
			break;
		}
		return sc->getTotalMoney();

	}
};
int main(int argc,char**argv)
{
	CashContext *cc;
	double price,num,discount,conditionMoney,ret;

	cin>>price>>num;
	cc=new CashContext(1,price,num);
	cout<<cc->getResult()<<endl;
	delete cc;

	cin>>price>>num>>discount;
	cc=new CashContext(2,price,num,discount);
	cout<<cc->getResult()<<endl;
	delete cc;

	cin>>price>>num>>conditionMoney>>ret;
	cc=new CashContext(3,price,num,conditionMoney,ret);
	cout<<cc->getResult()<<endl;
	delete cc;

	cin>>price>>num>>conditionMoney>>ret;
	cc=new CashContext(4,price,num,conditionMoney,ret);
	cout<<cc->getResult()<<endl;
	delete cc;

	return 0;
	
}

此处觉得有不妥,一旦超市推出另外一些活动,CashContext类中用于switch判断的代码就要修改,程序需要重新编译。这在实际应用中是不可能的。第二章的最后提了一下使用映射可以解决这个问题。但不知映射为何物,拭目以待吧

注:此处实现的收费对象类,比书上的多实现了返点类。关于此类不知应该将其归为哪一部分,暂将其放入收费对象类中。但觉得不应该与收费对象类放在一起,应该有另外一个类处理返点。毕竟积分信息的管理对于大型超市来说也是很重要的一部分。

分享到:
评论

相关推荐

    javascript设计模式之策略模式学习笔记.docx

    javascript设计模式之策略模式学习笔记.docx

    设计模式之策略模式 鸭子问题

    这是策略模式中的一个经典实例,通过鸭子问题,能让学习者更好的了解设计模式,这也是headfirst 设计模式中用的经典实例

    设计模式之策略模式

    设计模式之策略模式学习代码 文章:http://blog.csdn.net/hailushijie/article/details/8611418 我是linux系统,下载后不能正常解压缩告诉我。

    javascript设计模式之策略模式学习笔记

    主要介绍了javascript设计模式之策略模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    设计模式C++学习之策略模式(Strategy)

    设计模式C++学习之策略模式(Strategy)

    Java 经典设计模式讲解以及项目实战

    3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+...

    设计模式之策略(Strategy)模式

    这份文档讲诉了设计模式之策略(Strategy)模式,希望可以帮助学习的人!

    php设计模式-策略模式-例题学习

    NULL 博文链接:https://xieye.iteye.com/blog/1070202

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    研磨设计模式(完整带书签).part2.pdf

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    常用设计模式学习脑图

    常用设计模式脑图,脑图中根据每个设计模式进行了详细的备注解释!我们的最强大脑在哪里?在这里!(单例模式、原型模式、工厂模式、代理模式、策略模式、适配器模式、委派模式、装饰器模式、观察者模式)

    HeadFirst 设计模式学习笔记1--策略模式Demo

    http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    本书适用于学习面向中对象设计和设计模式的学生、程序员以及从事软件开发的人士。 本书要点包括: 对象、封装和继承的新观点。 设计模式的思想、起源及其在软件设计学科中的应用。 模式基础以及使用统一建模语言...

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

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    java后端开发+java23种设计模式学习demo

    里面包含常规算法学习demo; 设计模式的分类 ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式 GOF 23

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    设计模式--C++

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory 模式 ...

    设计模式:可复用面向对象软件的基础--详细书签版

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 monoglyph 30 2.4.3 decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 abstract ...

    Java常用设计模式例子

    以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...

Global site tag (gtag.js) - Google Analytics