一、策略模式的相关介绍
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。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。