一、策略模式的相关介绍
1、定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2、举例:商场中卖商品有原件、打折和满m元就减n元多种策略,可以将它们封装起来,然后通过策略类让这些方法可以被客户端选择。
3、UML图:
4、所属类别:行为型
二、C++程序实现
1 // 策略模式.cpp : 定义控制台应用程序的入口点。 2 //以商场里打折促销策略为例 3 4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 8 //策略类,输入原价,输出打折后应该收取的钱 9 class Strategy 10 { 11 public: 12 Strategy(); 13 virtual ~Strategy(); 14 virtual double acceptcash(double cash)=0; 15 }; 16 Strategy::Strategy() 17 {} 18 Strategy::~Strategy() 19 {} 20 21 //具体的策略1,原价买单 22 class Cashnomal :public Strategy 23 { 24 public: 25 Cashnomal(); 26 virtual ~Cashnomal(); 27 virtual double acceptcash(double cash); 28 }; 29 Cashnomal::Cashnomal() 30 {} 31 Cashnomal::~Cashnomal() 32 {} 33 double Cashnomal::acceptcash(double cash) 34 { 35 return cash; 36 } 37 //具体的策略2,打rebate折 38 class Cashrebate :public Strategy 39 { 40 private: 41 float r; 42 public: 43 Cashrebate(float rebate); 44 ~Cashrebate(); 45 virtual double acceptcash(double cash); 46 }; 47 Cashrebate::Cashrebate(float rebate) 48 { 49 r=rebate; 50 } 51 Cashrebate::~Cashrebate() 52 {} 53 double Cashrebate::acceptcash(double cash) 54 { 55 return cash*r; 56 } 57 // 58 //具体的策略3,满money元减rmoney元 59 class Cashreturn :public Strategy 60 { 61 private: 62 double m,r; 63 public: 64 Cashreturn(double money,double rmoney); 65 ~Cashreturn(); 66 virtual double acceptcash(double cash); 67 }; 68 Cashreturn::Cashreturn(double money,double rmoney) 69 { 70 m= money; 71 r=rmoney; 72 } 73 Cashreturn::~Cashreturn() 74 {} 75 double Cashreturn::acceptcash(double cash) 76 { 77 return cash-(cash/m)*r; 78 } 79 80 //context上下文类 81 class context 82 { 83 private: 84 Strategy *cs; 85 public: 86 context(Strategy *csin); 87 virtual ~context(); 88 double getresult(double money); 89 }; 90 context::context(Strategy *csin) 91 { 92 cs=csin; 93 } 94 context::~context() 95 { 96 97 } 98 double context::getresult(double money) 99 { 100 return (*cs).acceptcash(money); 101 } 102 //用户程序 103 int _tmain(int argc, _TCHAR* argv[]) 104 { 105 //选择一种促销模式 106 int mode; 107 context *cc; 108 cout<<"请选择一种促销模式 1:无促销,2:打折促销,3返利促销"<<endl; 109 cin>>mode; 110 switch(mode) 111 { 112 case 1: 113 cc=new context(new Cashnomal()); 114 break; 115 case 2: 116 cc=new context(new Cashrebate(0.8)); 117 break; 118 case 3: 119 cc=new context(new Cashreturn(100,10)); 120 break; 121 } 122 cout<<"请输入商品原价"<<endl; 123 double price; 124 cin>>price; 125 double totalprice=(*cc).getresult(price); 126 cout<<"促销之后的价格是"<<totalprice<<endl; 127 return 0; 128 }
解释一下为什么第84行为什么是Strategy *cs;而不能写成Strategy cs;
因为Strategy类是一个抽象类,不能被实例化,所以只能用指针或者引用。
抽象类:就是包含有未定义的虚函数的类,也就是说只在类中声明了一个抽象类,但没有具体定义,或者把虚函数定义为virtual void f()=0;这样的形式。注意函数后有一个=0。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。