设计模式---策略模式

来源:互联网 发布:网页设计软件 编辑:程序博客网 时间:2024/06/08 13:11
策略模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,
减少了各种算法类与使用算法类之间的耦合。其优点还有,简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

下面实例是简单工厂模式加策略模式

#include<iostream>
#include<stdio.h>

using namespace std;

class CashSuper
{
    public:
        virtual double acceptCash(double money) = 0;
};

class CashNormal:public CashSuper
{
    public:
        double acceptCash(double money)
        {
            return money;
        }
};

class CashRebate:public CashSuper
{
    private:
        double zhe;
    public:
        CashRebate(double zhe)
        {
            this->zhe = zhe;
        }
        double acceptCash(double money)
        {
            return money * zhe;
        }
};

class CashReturn:public CashSuper
{
    private:
        double cond;
        double retu;
    public:
        CashReturn(double cond ,double retu)
        {
            this->cond = cond;
            this->retu = retu;
        }

        double acceptCash(double money)
        {
            double result = money;
            if(money > cond)
                result = money - money/cond*retu ;
            return result;
        }
};

class CashContext
{
    private:
        CashSuper *cs;
    public:
        CashContext(int  type)
        {
            switch(type)
            {
                case 1:
                    CashNormal *cs0;
                    cs0 = new CashNormal();
                    cs = cs0;
                    break;
                case 2:
                    CashReturn *cs1;
                    cs1= new CashReturn(300,100);
                    cs = cs1;
                    break;
                case 3:
                    CashRebate *cs2;
                    cs2= new CashRebate(0.8);
                    cs = cs2;
                    break;
                default:
                    break;
            }
        }
    double GetResult(double money)
    {
        return cs->acceptCash(money);
    }
};

int main()
{
    CashContext *csuper = new CashContext(1);
    double totalprice = csuper->GetResult(10*28);
    cout<<"1--price="<<totalprice<<endl;
    
    csuper = new CashContext(2);
    totalprice = csuper->GetResult(10*38);
    cout<<"2--price="<<totalprice<<endl;
    
    csuper = new CashContext(3);
    totalprice = csuper->GetResult(10*28);
    cout<<"3--price="<<totalprice<<endl;
}


原创粉丝点击