设计模式(五)策略模式(Strategy Pattern)

Key:策略模式定义一系列的算法,将每一种算法封装起来并可以相互替换使用。

策略模式定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。策略模式是处理算法不同的变体的一种行为模式,通过在抽象策略中定义算法接口或封装算法标识,实现该抽象粗略的具体子类成为一个单独的算法,即具体策略。策略模式用多个类来区分不同的行为,使用策略模式可以避免暴露复杂的、与算法相关的内部数据结构。客户端可以在运行的时候动态地设置需要的具体策略,进行算法运算,而不用修改客户端应用程序内容就可以达到不同的算法行为。每一种算法作为独立的一个类实现,更加易于扩展,增加一个策略只要新增加一个类实现抽象接口即可达到目的,对与原有系统没有任何影响,从而保持系统的稳定性。还可以使得算法之间的耦合性减少,防止一个算法对其他算法的影响。

 

策略模式有三种角色:
(1)抽象策略,定义公共的策略方法(算法)。
(2)具体粗策略,实现具体的策略算法。
(3)上下文环境,就是使用策略的的地方。

下面的例子为一个非常简单的商场促销的例子,促销的策略抽象出来,具体的促销方法(算法)在下面的子类中实现。

 

 

 

代码:

#include <iostream>
using namespace std;

class Strategy
{
        public:
                virtual float realPrice(float p) = 0;
};

class StrategyA:public Strategy
{
        public:
                float realPrice(float p)
                {return 0.8*p;};//八折策略
};

class StrategyB:public Strategy
{
        public:
                float realPrice(float p)
                {
                        if(p >= 2000)//满2000减500策略
                                return p-500;
                        else
                                return p;
                };
};

class Context
{
        private:
                Strategy* strategy;
        public:
                void setStrategy()
                {
                        //strategy = new StrategyA(); //可以通过配置文件,参数等设置不同的策略
                        strategy = new StrategyB();
                };

                float calculate(float price)
                { return strategy->realPrice(price);};
};
int main()
{
        Context *c = new Context();
        c->setStrategy();
        cout<<c->calculate(2000)<<endl;
        return 0;
}

 

// add 2013-8-5

        和状态模式有点类似,但是状态模式的首先是要有“状态”的,几个状态之间有一定的关系,状态数目也是一定的,而策略模式则不是,没有什么状态,各个策略比较独立。

参考:

设计模式那点事

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值