策略模式

来源:互联网 发布:数据库故障应急预案 编辑:程序博客网 时间:2024/05/01 11:25

 

策略模式:

        它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。

意图:

        同一函数接口实现不同的算法。

角色及职责:

        抽象策略类(Strategy):提供这一系列算法的统一函数接口。

        具体策略类(Concrete Strategy):根据需求实现的不同算法。

        环境类(Context):策略管理类,设置当前策略。

特点

    优点:

        1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
   2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
        3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

    缺点:

        1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
        2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

典型例子:

        计算器+ - * /运算

示例代码:

//strategy抽象类,用作接口class Strategy{public:virtual string substitute(string str)=0;virtual ~Strategy(){cout<<" in the destructor of Strategy"<<endl;}};class ChineseStrategy:public Strategy{public:string substitute(string str){int index=str.find("520");string tempstr=str.replace(index,3,"我爱你");return tempstr;}~ChineseStrategy(){cout<<"in the destructor of ChineseStrategy"<<endl;}};class EnglishStrategy:public Strategy{public:string substitute(string str){int index=str.find("520");string tempstr=str.replace(index,3,"i love ou");return tempstr;}~EnglishStrategy(){cout<<" in the destructor of ChineseStrategy"<<endl;}};//Context类class Translator{private:auto_ptr<Strategy> strategy;         //在客户代码中加入算法(stategy)类型的指针。public:~Translator(){cout<<" in the destructor of Translator"<<endl;}void set_strategy(auto_ptr<Strategy> strategy){this->strategy=strategy;}string translate(string str){if(0==strategy.get())return "";return strategy->substitute(str);}};
int main(int argc, char *argv){string str("321520");Translator *translator=new Translator;//未指定strategy的时候cout<<"No Strategy"<<endl;translator->translate(str);cout<<"---------------"<<endl;//翻译成中文auto_ptr<Strategy> s1(new ChineseStrategy);translator->set_strategy(s1);cout<<"Chinese Strategy"<<endl;cout<<translator->translate(str)<<endl;cout<<"---------------"<<endl;//翻译成英文auto_ptr<Strategy> s2(new EnglishStrategy);translator->set_strategy(s2);cout<<"English Strategy"<<endl;cout<<translator->translate(str)<<endl;cout<<"----------------"<<endl;delete translator;return 0;}


 

原创粉丝点击