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

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

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

//策略模式的三个步骤

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. jQuery 事件探秘

    jQuery 事件中为 dom 元素动态绑定事件的方式: 绑定事件到元素上 $(selector).bind('eventName', function(){}); 一次绑定多个事件时,事件名用单个空 ...

  2. oracle 执行 delete user$ 误删所有用户信息后的数据恢复流程

    起因: 在oracle测试过程中,不小心执行了delete user$ 命令,导致oracle当前实例所有的用户信息丢失,包括sys用户. 第一次使用DUL工具数据恢复:失败 下载ParnassusD ...

  3. Google Authenticator

    Google Authenticator 现在越来越多的网站采用两步验证,实现方式可能有所区别,一般来说是 1+? (1 即 普通的用户名和密码, ?可能是实物如U盾.手机短信验证码或其他).?的重点 ...

  4. C#小程序飞行棋地图绘制

    1. 初始化地图,在绘制时可先将地图进行初始化,用数组来存储关卡的位置,然后利用循环给地图中 关卡所在处赋予代表关卡的值. 关键代码如下 /// <summary> /// 初始化游戏地图 ...

  5. jquery下常用正则表达式整理(可直接粘贴使用)

    与正则表达式做比较的方法 var _val = '1234'; var _ev = /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z] ...

  6. 15,SFDC 管理员篇 - 变更和部署

    Setup | Deploy | Sandbox 通过在Production上建立Dev .Test 两套环境来   Sandbox 有四种类型 Developer Sandbox & Dev ...

  7. java SE编写图形应用程序

    借鉴了java 核心技术卷1    并参考http://www.jb51.net/article/56158.htm 添加了JTextField的使用. ####################### ...

  8. Windows程序设再读笔记02-Unicode

    1.ASCII,7位编码,共128个编码,1950年ansi提出. 2.变种的Ascii,0x40等10个代码保留各个国家单独使用,1967年由iso提出.旨在解决重音符号,英镑符号的问题. 3.扩展 ...

  9. 最全面的 C++ 资源、框架大全

    转载自   http://www.codeceo.com/article/cpp-resource-framework.html#0-tsina-1-99850-397232819ff9a47a7b7 ...

  10. * {margin:0px; padding:0px;}什么意思?

    * {margin:0px; padding:0px;} *  表示所有的元素的对齐方式以及和父类之间的间距都为0 body{margin:0px;padding:0px;} body里面的则表示的是 ...