学习设计模式最重要的就是思想,掌握了其思想实现起来就比较简单了。讲解策略模式之前先讲解三个设计模式的原则。
设计原则1:把变化的接口,和不变的接口独立起来,不要混合使用。顾名思义,在继承体系中变化的接口如果发生的细小的改变便会导致其子类发生很大的变化,会导致类很难管理。
设计原则2:针对接口编程(父类),而不是实现编程。因为针对接口编程可以使用多态,而且父类通常为抽象基类,节省了内存的占有资源。
设计原则3:多用内含或者聚合(Has-a),少用继承(Is-a)。因为继承会降低代码的效率,会增大对象的内存的占有资源。
策略模式的思想:定义算法族,分别进行封装,让他们之间可以进行互换,此模式让算法的变化独立于使用算法的客户。也就是说,把变化的接口独立封装起来,通过接口指向其行为的类,实现多态。而这些行为的类,我们也可以称为“算法”。这种模式弹性很大。
class FlyBehavior {
public:
virtual void fly() = 0;
};
class QuackBehavior {
public:
virtual void quack() = 0;
};
class FlyWithWings :public FlyBehavior {
public:
void fly()override {/*......*/};
};
class FlyNoWay :public FlyBehavior {
public:
void fly()override {/*......*/ };
};
class Quack :public QuackBehavior{
public:
void quack()override {/*......*/ };
};
class Squack :public QuackBehavior {
public:
void quack()override {/*......*/ };
};
class MuteQuack :public QuackBehavior {
public:
void quack()override {/*......*/ };
};
class Duck {
public:
void swim() {};
void SetPerformfly(FlyBehavior* _fly/*实现多态*/) {
flybehavior = _fly;
flybehavior->fly();
};
void SetPerfromquack(QuackBehavior* _quack/*实现多态*/) {
quackbehavior = _quack;
quackbehavior->quack();
};
public:
Duck() {};
Duck(const FlyBehavior& fly_, const QuackBehavior& quack_) :flybehavior(std::move(fly_)), quackbehavior(std::move(quack_)) {};
~Duck() {};
protected:
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
};
class MallaredDuck :public Duck {
public:
};
class RedheadDuck :public Duck {
public:
};
class RubberDuck :public Duck {
public:
};
int main(void)
{
FlyWithWings flywithwings;
RedheadDuck redheadduack;
redheadduack.SetPerformfly(&flywithwings);
return 0;
}