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

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

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

//策略模式的三个步骤

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. Codeforces 732F [边双联通分量][tarjan]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个无向图.现在要求给这个无向图的边加上方向. 定义f(x)为从x点出发能够到达的点的数目. 使得MIN(f(x))最大. 思路: 先tarja ...

  2. (转)C#调用默认浏览器打开网页的几种方法

    转载,原文地址:http://blog.csdn.net/testcs_dn/article/details/42246969 CSharp调用默认浏览器打开网页的几种方法 示例界面: 方法一:从注册 ...

  3. mvc ajax csrf

    http://www.cnblogs.com/zhyp/p/5556980.html http://www.asp.net/web-api/overview/security/preventing-c ...

  4. 简约的ASP.NET 系统框架,提供源码。

    好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...

  5. load mainaccount

    static void LoadMainAccountCSV(Args _args) { /* SysExcelApplication        excel; SysExcelWorkbooks  ...

  6. Tiny_4412的NFS挂载

    设备连接:          交叉网线          串口线          usb线          电源线 网络设置: 笔记本ubuntu:wifi处,设置IPv4设置“仅本地连接”,不要 ...

  7. jquery append 方法应用

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>< ...

  8. hibernate中的cascade和inverse

    以Student和class为例,一个Student对应一个class,一个class对应多个Student. Student.hbm.xml <?xml version="1.0&q ...

  9. 火币网api的nodejs实现

    var request = require('request'); var crypto = require('crypto'); var config = { api_url: 'https://a ...

  10. MongoDB学习笔记(索引)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...