您的位置:首页 > 编程语言 > C语言/C++

C++主题——策略模式

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

模板方法模式定义了一个算法的骨架,把实现交给派生类具体实现,用户不必知道怎么实现,因为他
已经被封装在一个不能改变的函数里了(非虚函数)。
策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用
户需要知道各种算法的具体情况,就像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)抽
象后派生,很多部分是重复的。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xscarlet/archive/2007/05/14/1608693.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: