策略模式(strategy pattern)
定义:策略模式定义了算法族, 将算法分别封装起来,让他们之间可以互相替换,让算法的实现独立于算法的使用者
wiki
In computer programming, the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm's behavior to be selected at runtime. The strategy pattern
defines a family of algorithms,
encapsulates each algorithm, and
makes the algorithms interchangeable within that family.
原则:
- 找出应用中的变化之处,并封装起来
- 多用组合,少用继承
- 针对接口编程,不针对实例编程
举个栗子:
code:
- 鸭子类,鸭子有会叫真鸭子,还有模型小鸭
- 鸭子主类中,将将飞和叫易变动的属性分割出来,以组合这两个类的方式,定义通用的鸭子
class Duck{
public:
Duck()
{
}
void performFly()
{
m_flyBehavior.fly();
}
void performQuack()
{
m_quackBehavior.quack();
}
void setFlyBehavior(FlyBehavior & fb)
{
m_flyBehavior = fb;
}
void setQuackBehavior(QuackBehavior & qb)
{
m_quackBehavior = qb;
}
private:
FlyBehavior m_flyBehavior;
QuackBehavior m_quackBehavior;
}
- 飞的类型
one time one thing, 飞行类算法
class FlyBehavior
{
public:
virtual void fly();
}
class FlyWithWings : public FlyBehavior
{
public:
virtual void fly()
{
std::cout << "我用翅膀灰" << std::endl;
}
}
class FlyNoWay : public FlyBehavior
{
public:
virtual void fly()
{
std::cout << "飞毛线,灰不起来" << std::endl;
}
}
- 嘎嘎叫的类
class QuackBehavior
{
public:
virtual void quack();
}
class Quack : public QuackBehavior
{
public:
virtual void quack()
{
std::cout << "嘎嘎嘎" << std::endl;
}
}
class MuteQuack : public QuackBehavior
{
public:
virtual void quack()
{
std::cout << "嘎你妹" << std::endl;
}
}
- 使用上面的算法组合出真正的鸭子和模型鸭子
class LovelyDuck : public Duck
{
LovelyDuck()
{
m_flyBehavior = FlyWithWings();
m_quackBehavior = Quack();
}
}
class ModelDuck : public Duck
{
ModelDuck()
{
m_flyBehavior = FlyNoWay();
m_quackBehavior = MuteQuack();
}
}
int main()
{
Duck &lovelyDuck = LovelyDuck();
Duck &ModelDuck = ModelDuck();
lovelyDuck.fly();
lovelyDuck.quack();
ModelDuck.fly();
ModelDuck.quack();
return 0;
}
模式思考:
- 优点: 策略模式组合使用算法族,使软件高复用,灵活
- 缺点: