博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:5080 次
发布时间:2019-06-12

本文共 2990 字,大约阅读时间需要 9 分钟。

一、策略模式的相关介绍

1、定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

2、举例:商场中卖商品有原件、打折和满m元就减n元多种策略,可以将它们封装起来,然后通过策略类让这些方法可以被客户端选择。

3、UML图:

4、所属类别:行为型

二、C++程序实现

1 // 策略模式.cpp : 定义控制台应用程序的入口点。  2 //以商场里打折促销策略为例  3   4 #include "stdafx.h"  5 #include
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返利促销"<
>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<<"请输入商品原价"<
>price;125 double totalprice=(*cc).getresult(price);126 cout<<"促销之后的价格是"<
<

解释一下为什么第84行为什么是Strategy  *cs;而不能写成Strategy  cs;

因为Strategy类是一个抽象类,不能被实例化,所以只能用指针或者引用。

抽象类:就是包含有未定义的虚函数的类,也就是说只在类中声明了一个抽象类,但没有具体定义,或者把虚函数定义为virtual void f()=0;这样的形式。注意函数后有一个=0。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。

转载于:https://www.cnblogs.com/bewolf/p/4220541.html

你可能感兴趣的文章
zend framework 韩顺平视频讲座笔记- (1) 环境配置
查看>>
股权期权问题基本上搞明白了
查看>>
ActionContext、ServletContext、pageContext的区别?
查看>>
基于行的操作
查看>>
新手 vim常用命令总结 (转)
查看>>
SharpNodeSettings项目,可配置的数据采集,统一的工业数据网关,OPC UA服务器开发,PLC数据发布到自身内存,redis,opc ua,以及数据可视化开发...
查看>>
面向对象——(4)静态方法
查看>>
定位真机运行能用但是打包成apk就不能用的解决方法
查看>>
[收藏贴]CSS Reset(忘记出处了)
查看>>
IOS开发之路四(UITabBarController)
查看>>
wcf 服务器无法处理请求由于内部错误
查看>>
windows下redis 配置文件参数说明
查看>>
Nginx缓存、压缩配置
查看>>
内网渗透笔记---msf
查看>>
小计一次linux下渗透方法
查看>>
移动开发小技巧
查看>>
linux基本命令(2)-备份压缩命令
查看>>
2.拷贝控制操作(三/五法则)
查看>>
Ubuntu11.04添加笔记本的触摸板的管理工具
查看>>
毕业论文排版
查看>>