首页 > 代码库 > 策略模式

策略模式

一、策略模式的相关介绍

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。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。

策略模式