策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中从而使得它们可以相互替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

//策略模式的三个步骤

1、策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)
2、实现的各种策略,各种策略的实现类,都必须继承抽象类
3、策略的设置接口类,设置不同策略

例子如下:

实现一个超市买东西正常收费、打折、超过一定数额返还金钱的策略

//策略的抽象类
class CashSuper
{
public:
  virtual double acceptMoney(double money) = 0;//抽象类,收取的纯虚函数
};

//策略1

class CashNormal :public CashSuper
{
public:
  double acceptMoney(double money)//正常收钱
  {
    return money;
  }
};

//策略2

class CashRebate :public CashSuper//打折
{
public:
  double acceptMoney(double money)//收钱
  {
    return money*discount;
  }
  CashRebate(double dis)//折扣
  {
    discount = dis;
  }
private:
  double discount;
};

//策略3

class CashReturn :public CashSuper
{
public:
  CashReturn(double mc,double mr)
{
  moneyCodition = mc;
  moneyReturn = mr;
}
  double acceptMoney(double money)//收钱
  {
    double result = money;
    if (money >= moneyCodition)
    {
      result = money - floor(money / moneyCodition)*moneyReturn;
    }
    return result;
  }
private:
  double moneyCodition;
  double moneyReturn;
};

//策略接口实现不同的策略

class CashContext

{
public:
  CashContext(string str)//设置策略
  {
    if (str == "正常收费")
  {
    cs = new CashNormal();
  }
  else if (str == "打9折")
  {
    cs = new CashRebate(0.9);
  }
  else if (str == "满1000反200")
  {
    cs = new CashReturn(1000, 200);
  }
 }
  double getResult(double money)
  {
    return cs->acceptMoney(money);
  }
private:
  CashSuper *cs;
};

void main()
{
  double money = 1000;
  CashContext *cc = new CashContext("满1000反200");
  cout << cc->getResult(money);

  cin.get();
}

C++设计模式-策略模式(2)的更多相关文章

  1. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  3. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  4. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  5. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  6. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  7. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  9. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  10. PHP设计模式-策略模式 转

    策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...

随机推荐

  1. JS技术大全(防止复制,粘贴等)

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...

  2. LeedCde 题解目录

    1. Longest Palindromic Substring ( 最长回文子串 ) 2. Median of Two Sorted Arrays (两个排序数组的中位数) 3. Sqrt(x) 4 ...

  3. 让reddit/r/programming炸锅的一个帖子,还是挺有意思的

    这是原帖 http://www.reddit.com/r/programming/comments/358tnp/five_programming_problems_every_software_en ...

  4. Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法

    <script type="text/javascript"> $('input:text:first').focus(); document.onkeydown = ...

  5. 解决oracle 中文入库是乱码的问题

    增加两个环境变量: LANG=zh_CN.GBK NLS_LANG  =  SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  6. 高性能网络编程(一)----accept建立连接

    编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点.希望应用代码完全不关 ...

  7. 修复HTTP 503错误

    要解决此问题,按照下列步骤操作: 1.验证是否已为虚拟服务器配置了应用程序池.默认的应用程序池是MSSharePointPortalAppPool. 请按照下列步骤来确定虚拟服务器正在使用的应用程序池 ...

  8. AngularJS-系统代码的配置和翻译

    前言:在Web开发中常常会遇到这样的情况,有些页面的下拉选项是固定不变的几个,比如:性别,一般有男.女.保密等.对于这样的情形我们一般在数据库中存储的是数字或者其对应的代码,如果是可维护的需要系统给出 ...

  9. Mybtis框架总结(一)

    一:Mybaits下载并搭建核心框架 1:下载mybatis的jar包: 2:创建mybatis框架链接数据库的配置文件Configuration.xml,格式如下 <!DOCTYPE conf ...

  10. 16.C语言中数据类型的本质含义是:表示一个内存格子的长度和解析方法。

    数据类型决定长度的含义:我们一个内存地址(0x30000000),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x3 ...