何时使用:
1.封装变化点是面向对象的一个重要思路,就和第一节提到的一样。
2.策略模式:是一种定义一系列算法的模式,这些方法完成的都是相同工作,只是实现不同,该模式可以以相同的接口调用来调用所有的算法和实现,以减少各个算法中的耦合度。
优点:
1.多个类只在算法实现上不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
2.算法之前互不影响。
3.用户不考虑算法实现细节。
如:
class Operate
{
public:
virtual void Calculate() = 0;
};
class DamageHP :
public Operate
{
public:
int m_nHP;
void Calaulate(){ m_nHP -= 1; };
};
class DamageMP :
public Operate
{
public:
int m_nMP;
void Calaulate(){ m_nHP -= 5; };
};
class Context
{
public:
Context( Operate _oper ){ oper = _oper; }
// 这里就实现的外部只考虑这个接口就可以了,
// 这个实现把各种算法都封装在了里面,最后暴露给用户的只用Context和实际算法了。用户不用考虑算法的具体实现。
void ContextInterface() { oper. Calaulate(); };
private:
Operate oper;
};
但是如果使用上面的方法还是未避免客户端判断逻辑的问题,我们这里考虑使用简单工厂模式,就报逻辑算法选择也封装在里面了
class Context
{
public:
Operate oper;
Context( inttype )
{
switch( type )
{
case 1:
{
oper = new DamageMP ();
}
break;
case 2:
{
oper = new DamageHP ();
}
break;
};
oper = _oper;
}
// 这里就实现的外部只考虑这个接口就可以了,
// 这个实现把各种算法都封装在了里面,最后暴露给用户的只用Context和实际算法了。用户不用考虑算法的具体实现。
void ContextInterface() { oper. Calaulate(); };
private:
Operate oper;
};