行为型模式
13)策略模式
本文参考:
从这一节开始介绍行为型模式。之前介绍的结构型模式主要侧重于通过继承、聚合的方式组合类和对象以形成更大的结构,而行为模式的主要特点就是处理的是对象之间的通信方式。
而为了遵循“一个类仅仅需要做好一件事“的原则,很多行为型模式都引入了中介者的角色用来隔离通信的两方。
策略模式其实非常简单,就是将实现的算法与使用的用户分离,从而让用户可以自由选择具体的算法。比如要计算税收,不同家庭要采用不同的策略去缴纳所得税。我们不能在程序中硬编码,而是让这个计算过程自由变化,这就是策略模式。
策略模式主要包含两个角色:
第一种,用户,一般是非抽象类。
第二种,策略,抽象类。
//给鸭子增加会飞的功能
class FlyBehavior{
public:
virtual void fly() = 0;
};
class FlyWithWings : public FlyBehavior{
public:
virtual void fly(){
cout<<"fly with wings"<<endl;
}
};
class FlyWithRocket: public FlyBehavior{
public:
virtual void fly(){
cout<<"fly with rocket"<<endl;
}
};
class Duck{
public:
void swim();
Duck(FlyBehavior* f):fb(f){}
//新增功能
virtual void performfly()
{
fb->fly();
}
private:
FlyBehavior* fb; //新增指针
};
int main()
{
FlyBehavior* fb = new FlyWithWings();
Duck* d = new Duck(fb);
d->performfly();
}
策略模式与桥接模式的区别
刚开始学习策略模式的时候,一直都分不清它和桥接模式的区别。因为两者的实现方式实在太像了,都是在类A里增加了一个指向类B的指针。然后类B可以通过继承来实现不同的算法。区别仅在于桥接模式里A一般也是抽象类可以继续扩展,而策略模式中A一般是作为调用者,不再有子类。
但是后面发现所有的设计模式的实现方式多多少少都有点类似,大体可以分为类模式和对象模式。也就是说要么通过继承实现扩展,要么通过包含对象来扩展。从而让不同的类结合起来实现一个复杂的系统。而不同的模式之间除了实现方式不同之外,更重要还在于设计模式的意图、使用场景不同。
桥接模式作为一个结构型模式,侧重于接口的隔离,也就是连接两个相互独立的类从而具有更加丰富的功能。
而策略模式作为一个行为型模式,侧重与调用者和被调用者的隔离,解耦上还仅仅是某一个算法的层次。
可以说策略模式是包含在桥接模式中。