• 策略模式


    一、策略模式的相关介绍

    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。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。

  • 相关阅读:
    jdbc调用存储过程和存储函数
    jdbc测试
    JDBC -JSP
    eclipse连数据库(sql server)的注意事项
    九大内置对象(新)
    application 全局对象
    编码:session
    建库和建表
    db vs dbm
    Source Insight异常退出,错误代码C0000005
  • 原文地址:https://www.cnblogs.com/bewolf/p/4220541.html
Copyright © 2020-2023  润新知