设计模式-----策略模式(strategy)

来源:互联网 发布:网络最火的直播软件 编辑:程序博客网 时间:2024/06/05 16:39

1.什么是策略模式

策略模式属于对象行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。

2.策略模式的结构

策略模式是对算法的包装,把使用算法的责任和算法本身分开,委派给不同的对象管理。

 \
 


    环境(Context)角色:持有一个Strategy引用;

抽象角色(Strategy)对象:抽象角色,由一个抽象类或借口实现,它指出所有的具体策略类所需的接口;

具体角色(ConcreteStrategy)对象:包装了相关算法或行为;

 比如说计算加班工资的一个小程序,对不同的情况要有不同的计算方法,普通加班一倍工资,周末加
班两倍工资,节假日加班三倍工资一样,计算类型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)抽
象后派生,很多部分是重复的。

3.策略模式和工厂模式的区别

工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化。
我们去旅行。策略模式的做法:有几种方案供你选择旅行,选择火车好呢还是骑自行车,完全有客户自行决定去构建旅行方案(比如你自己需要去买火车票,或者机票)。而工厂模式是你决定哪种旅行方案后,不用关注这旅行方案怎么给你创建,也就是说你告诉我方案的名称就可以了,然后由工厂代替你去构建具体方案(工厂代替你去买火车票)。


4.策略模式的优缺点

优点:

(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。


缺点:

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。




0 0