策略模式

时间:2022-04-26
本文章向大家介绍策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、策略模式的相关介绍

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