策略模式与简单工厂模式
2011-09-05 22:28
537 查看
昨天用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)中添加了执行方法而已。不懂到底有什么区别。
介两个老哥的问题我也很费解
看了下原来工厂和策略的代码
我发现两个工厂类(简单工厂、策略工厂)里面有一个不同
简单工厂返回了一个基类对象的指针
而策略工厂 由于设计的时候就有基类对象指针这个属性 所以没有返回值
莫非这点就是设计上的区别??
------------------------------------------------------------------------------------------------------------------
代码(仅工厂段)
简单工厂
策略工厂
------------------------------------------------------------------------------------------------------------------
另一个老哥
策略模式:定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
简单工厂:将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。
简单工厂严格意义上不是一种设计模式,只能是一种良好的编程习惯。
好像是说策略模式封装的是算法 注重的是算法的一些东西
简单工厂注重的是对象创建(因为会返回一个基类对象的指针)
╮(╯▽╰)╭
大体上我近期就了解这么多了
把策略模式的代码贴上
开始的时候很迷茫
因为感觉和简单工厂差的不是很多
—————————————————————————————————————————————
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; }
相关文章推荐
- 策略模式+简单工厂模式
- 简单工厂与策略模式
- 简单工厂和策略模式的区别
- 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别
- 简单工厂模式和策略模式的区别
- 简单工厂 和 策略模式的区别
- 策略模式和简单工厂
- 简单工厂模式和策略模式的区别
- 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别
- 设计模式随笔-策略模式与简单工厂的区别
- 设计模式笔记——策略模式VS简单工厂模式
- 简单工厂模式和策略模式的区别
- 大话设计模式之策略模式(结合简单工厂),程序完善过程蕴含智慧
- 简单工厂模式和策略模式
- 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别
- 【设计模式】策略模式PK简单工厂模式
- 对设计模式的总结之简单工厂与策略模式
- 策略模式结合简单工厂模式
- 策略模式与状态工厂,简单工厂的恩怨
- 简单工厂模式和策略模式理解