设有一基类Duck, 因为要添加新功能所以可能要修改基类, 其中可能遇到的问题有:
1. 代码在子类中重复.
2. 很难知道所有子类的全部行为.
3. 改变会牵一发而动全身, 造成其他子类不必要的改变.
解决方法为:
1. 找出应用中可能要变化之处, 把它们独立出来
2. 将可能变化的行为设计为接口, 而不是在类中实现它们
3. 多使用类似接口的组合而不是继承
示例:
//strategy pattern implemented by using fuction pointer
class Duck
{
public:
typedef void (*FlyBehavior)();
explicit Duck (FlyBehavior _fly_behavior = defaultFlyBehavior) :
fly_behavior (_fly_behavior)
{}
void fly ()
{
fly_behavior();
}
void setFlyBehavior (const FlyBehavior&);
private:
FlyBehavior fly_behavior;
};
void Duck::setFlyBehavior (const FlyBehavior &_fly_behavior)
{
fly_behavior = _fly_behavior;
}
void FlyNoWay () { cout << "I cannot fly!"; }
int main ()
{
ios::sync_with_stdio (false);
auto duck = make_shared
(FlyNoWay);
duck->fly ();
cout << "\n";
duck->setFlyBehavior (defaultFlyBehavior);
duck->fly ();
cout << endl;
return 0;
}
//strategy implement by Functional way
class Duck
{
public:
typedef std::function
FlyBehavior;
explicit Duck (FlyBehavior _flyBehavior = defaultFlyBehavior) :flyBehavior (_flyBehavior) {}
void setFlyBehavior (FlyBehavior _flyBehavior)
{
flyBehavior = _flyBehavior;
}
void Fly ()
{
flyBehavior ();
}
private:
FlyBehavior flyBehavior;
};
int main ()
{
ios::sync_with_stdio (false);
auto duck = make_shared
();
duck->Fly ();
cout << "\n";
duck->setFlyBehavior (flyNoWay);
duck->Fly ();
cout << endl;
return 0;
}
//strategy pattern by virtual function
class FlyBehavior
{
public:
virtual void Fly () = 0;
virtual ~FlyBehavior() = default;
};
class FlyWithWings : public FlyBehavior
{
public:
void Fly ()override
{
cout << "I am flying~";
}
};
class FlyNoWay :public FlyBehavior
{
public:
void Fly ()override
{
cout << "I am cannot Fly!";
}
};
class Duck
{
public:
explicit
Duck (shared_ptr
_flyBehavior
= make_shared
()) : flyBehavior (_flyBehavior) {} virtual ~Duck() = default; virtual void Fly () { flyBehavior->Fly (); } void setFlyBehavior (shared_ptr
_flyBehavior) { flyBehavior = _flyBehavior; } private: shared_ptr
flyBehavior; }; int main () { ios::sync_with_stdio (false); auto duck = make_shared
(); duck->Fly (); cout << "\n"; duck->setFlyBehavior (make_shared
()); duck->Fly (); cout << endl; return 0; }