2.策略模式

来源:互联网 发布:淘宝跨店抵用券怎么用 编辑:程序博客网 时间:2024/05/16 15:49

1策略模式的核心内容是:

A:包含策略的抽象类

B:不同的策略分别实现

C:策略控制器,通过这个策略控制器实现调度控制策略。

2策略模式的作用是根据传递进去的参数不同,实现调度执行不同的策略。

3策略模式具体描述

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

 

从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

 

发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

 

各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

修改都不会影响到环境和客户端。

 

跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

我的追MM锦囊中有好多Strategy哦。

 

策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

实现的各种策略,各种策略的实现类,都必须继承抽象类

策略的设置接口类,设置不同策略

4.策略模式类图

5.代码:

#include<iostream>

#include<cmath>

#include<string>

usingnamespacestd;

//策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

 

//从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

 

//发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

 

//各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

//修改都不会影响到环境和客户端。

//

//跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

//有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

//我的追MM锦囊中有好多Strategy哦。

 

//策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

//实现的各种策略,各种策略的实现类,都必须继承抽象类

//策略的设置接口类,设置不同策略

 

//收钱的抽象类,也就是策略的抽象类

classCashSuper

{

public:

   //收钱的纯虚函数

   virtualdoubleacceptMoney(doublemoney) = 0;

};

 

//正常收钱的策略

classCashNormal :publicCashSuper

{

public:

   //正常收钱

   doubleacceptMoney(doublemoney)

   {

       returnmoney;

   }

};

 

//打折的策略

classCashRebate :publicCashSuper

{

private:

   doublediscount;

public:

   //折扣

   CashRebate(doubledis)

   {

       discount =dis;

   }

   //收钱

   doubleacceptMoney(doublemoney)

   {

       //折扣

       returnmoney*discount;

   }

};

 

//返现的策略

classCashReturn :publicCashSuper

{

private:

   doublemoneyCondition;

   doublemoneyReturn;

public:

   //花多少钱,返回多少钱

   CashReturn(doublemc,doublemr)

   {

       moneyCondition =mc;

       moneyReturn =mr;

   }

   //收钱,返款

   doubleacceptMoney(doublemoney)

   {

       doubleresult =money;

       if (money >= moneyCondition)

       {

           result =money -floor(money / moneyCondition)*moneyReturn;

       }

       returnresult;

   }

};

 

//策略的控制类

class CashContext

{

private:

   CashSuper *cs;

public:

   CashContext(stringstr)//设置策略

   {

       if (str == "正常收费")

       {

           cs =newCashNormal();

       }

       elseif (str == "9")

       {

           cs =newCashRebate(0.9);

       }

       elseif (str == "1000200")

       {

           cs =newCashReturn(1000, 200);

       }

   }

   doublegetResult(doublemoney)

   {

       returncs->acceptMoney(money);

   }

};

 

intmain()

{

   doublemoney = 1000;

   //可以改变下面括号中的值,如果是下面的的一句,运行结果是800

   //CashContext *cc = new CashContext("1000200");

   //若是下面这句,显示的是1000

   //CashContext *cc = new CashContext("正常收费");

   //下面的这句的意思是打九折,运行结果是:900

   CashContext *cc = newCashContext("9");

   

   cout <<cc->getResult(money);

   cin.get();

   return 0;

}

 


0 0
原创粉丝点击