首页 > 代码库 > 2.策略模式

2.策略模式



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;

}

 

2.策略模式