•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

C++设想形式浅识战略形式【C#.Net教程】,C++,设计模式,策略模式

摘要: 战略形式定义:定义了算法家属,离别封装起来,让他们之间能够相互替代,此形式让算法的变化,不会影响到运用算法的客户。战略形式包含以下角色:Context:环境类Strat...
战略形式定义:

定义了算法家属,离别封装起来,让他们之间能够相互替代,此形式让算法的变化,不会影响到运用算法的客户。

战略形式包含以下角色:

Context:环境类

Strategy:笼统战略类

ConcreteStrategy: 详细战略类

UML类图:

测试用例

[code]int main(){
    //商品用度
    double cost;
    //采纳某种收费战略以后的用度
    double result;
    //如果
    cost = 1029.88;

    //声明要运用的详细战略类
    //这里显现出了战略类的瑕玷:客户端必需晓得有哪些详细封装的算法。如本例必需晓得三种收费体式格局Normal、Return、Rebate。
    StrategyCashSuper *Normal = new ConerectStrategyNormal(cost);//笼统战略类(基类)指针指向派生类->详细战略类(一般收费体式格局)
    StrategyCashSuper *Return = new ConerectStrategyReturn(cost); //满300返100收费体式格局
    StrategyCashSuper *Rebate = new ConerectStrategyRebate(cost); //打八折收费
    //声明环境类,详细挪用的算法,由它来庇护
    Context *c = new Context();
    //设置运用的战略类
    c->setStrategy(Normal);//设置为一般收费
    //挪用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    c->setStrategy(Return);//设置为满300返100收费体式格局
    //挪用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    c->setStrategy(Rebate);//设置为打八折收费
    //挪用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    return 0;
}

头文件Strategy.h

[code]#ifndef _2STRATEGY_H_
#define _2STRATEGY_H_
//战略类,算法基类
class StrategyCashSuper{
protected:
    //商品敷衍用度,定义为庇护成员供子类继续
    double cost;   
public:
    //组织函数
    StrategyCashSuper(double c):cost(c){}
    //收费效果算法
    virtual double ChargeResult();//本想定义为纯虚函数,但不能够。由于虚基类本不能实例化
};

//一般收费算法
class ConerectStrategyNormal: public StrategyCashSuper{
public:
    //组织函数
    ConerectStrategyNormal(double c):StrategyCashSuper(c){}
    //依据本类的收费体式格局,重写继续的收费算法
    double ChargeResult()override;
};

//满300返100收费算法
class ConerectStrategyReturn: public StrategyCashSuper{
public:
    //组织函数
    ConerectStrategyReturn(double c):StrategyCashSuper(c){}
    //重写收费算法
    double ChargeResult()override;    
};

//打八折收费算法
class ConerectStrategyRebate: public StrategyCashSuper{
public:
    //组织函数
    ConerectStrategyRebate(double c):StrategyCashSuper(c){}
    //重写收费算法
    double ChargeResult()override;  

};

//环境类,依据详细算法,庇护上下文运用的类
class Context{
private:
    //战略基类
    StrategyCashSuper *SCS;
public:
    //设置运用的战略
    void setStrategy(StrategyCashSuper *s);
    //详细实行的算法
    double getChargeResult();
};

#endif

完成Strategy.cpp

[code]#include "2Strategy.h"
//基类
double StrategyCashSuper::ChargeResult(){
    return 0;
}

//一般收费
double ConerectStrategyNormal::ChargeResult(){
    return cost;
}

//满300返100收费算法
double ConerectStrategyReturn::ChargeResult(){
    double res = cost;
    if(res >= 300)
        res = cost - 100;
    return res;
}
//打八折收费算法
double ConerectStrategyRebate::ChargeResult(){
    return cost *0.8;
}

//设置运用的算法
void Context::setStrategy(StrategyCashSuper *s){
    SCS = s;
}

//详细实行的算法
double Context::getChargeResult(){
    return SCS->ChargeResult();
}

总结:

战略形式让算法独立于运用它的客户而变化,也成为政策形式。战略形式是一种对象行动型形式。

战略形式包含3个角色:笼统战略类为所支撑的算法声清楚明了笼统要领,是一切战略类的父类;详细战略类完成了在笼统战略类中定义的算法。环境类在处理某个题目时能够采纳多种战略类(瑕玷是客户端须要晓得一切封装的战略类),在环境类中庇护一个对笼统战略类的援用实例。

战略形式是对算法的封装,它把算法的义务和算法自身分割开,委派给差别的对象治理。战略形式一般把一个系列的算法封装到一系列的战略类内里,作为一个笼统战略类的子类。

战略形式重要长处在于对“开闭准绳”的圆满支撑,在不修正原有体系的基础上能够替换算法或许增添新的算法,它很好的治理算法家属,提高了代码的复用性,是一种替代继续,防止多重前提转移语句的完成体式格局;其瑕玷在于客户端必需晓得一切的战略类,并明白其区分,同时在肯定程度上增添了体系中类的个数,可能会存在很多战略类。

战略形式实用状况包含:在一个体系内里有很多类,它们之间的区分仅在于它们的行动,运用战略形式能够动态地让一个对象在很多行动中挑选一种行动;一个体系须要动态地在几种算法中挑选一种;防止运用难以庇护的多重前提挑选语句;愿望在详细战略类中封装算法和与之相干的数据结构。

以上就是C++设想形式浅识战略形式的内容,更多相干内容请关注ki4网(www.ki4.cn)!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号