C++主题——策略模式

来源:互联网 发布:mac 安全设置偏好 编辑:程序博客网 时间:2024/05/22 06:39

C++主题——策略模式

       与模板方法模式类似,策略模式也是对一些算法的调度,只不过这些算法是同类型算法,而不像模板
方法模式那样是一些不同类型算法的一种顺序上的调度。模板方法像是围棋中的布局阶段,策略模式更像
是接下来的实战。针对不同的事情应用不同的策略完成相同的结果,这是策略。

        模板方法模式定义了一个算法的骨架,把实现交给派生类具体实现,用户不必知道怎么实现,因为他
已经被封装在一个不能改变的函数里了(非虚函数)。
        策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用
户需要知道各种算法的具体情况,就像warcraft中步兵克枪兵,枪兵克龙鹰一样,要求用户在正确的时机
调用正确的算法。

       比如说计算加班工资的一个小程序,对不同的情况要有不同的计算方法,普通加班一倍工资,周末加
班两倍工资,节假日加班三倍工资一样,计算类型CalcWage派生出三种类型Normal/WeekDay/FeastDay,
他们分别实现了计算本身时段加班工资的方法。 

Class Wage
{
public:
      Wage(CalcWage
* ptrCalcWage) : m_ptrCalcWage(ptrCalcWage)
      
{......}

      
double GetWage()
      
{
            
return m_ptrCalcWage ->CalculageWage();            
      }

private:
      CalcWage
* m_ptrCalcWage;
}
;

Class CalcWage
{
public:
      
virtual double CalculageWage(......) = 0;
}
;

Class CalcWageNormal
{
public:
       
double CalculageWage(......) ;
}
;

Class CalcWageWeekDay
{
public:
       
double CalculageWage(......) ;
}
;

Class CalcWageFeastDay
{
public:
       
double CalculageWage(......) ;
}
;

//使用时:
Wage(new CalcWageNormal);
Wage(
new CalcWageWeekDay);
Wage(
new CalcWageFeastDay);

 

        在使用CalcWage的类型Wage中,保存了一个CalcWage的指针,在需要的时候传递给它不同的子类型。
这其实造成了用户的一种负担,在消除程序员编码维护时的负担后,要求该类型的用户(可能是程序言自己)
在使用期通过调用确定正确的算法,而不是在这里通过一个基类型的指针实现多态,这个调用多态的行为在
算法的抽象类(CalcWage)里,而不是包含算法的使用类(Wage)里。但是另一方面,达到了复用其他代
码的要求,毕竟一组算法是很相似的,要求接口也相同,如果把整个外部类型(包含该算法的类型Wage)抽
象后派生,很多部分是重复的。

        那天baidu了一篇云风大侠对C++实现模式的不便之处的感想,后来看了boost::function,觉得C++其
实也还是不错的,不过自己还是新手,体会不深。有兴趣的朋友可以看看Effective C++的第35条,有简略的介
绍。

        希望C++越来越好:)
 

原创粉丝点击