【c++设计模式】策略模式

行为型模式

13)策略模式

本文参考:

https://www.cnblogs.com/draem0507/p/3794536.html

从这一节开始介绍行为型模式。之前介绍的结构型模式主要侧重于通过继承、聚合的方式组合类和对象以形成更大的结构,而行为模式的主要特点就是处理的是对象之间的通信方式。
而为了遵循“一个类仅仅需要做好一件事“的原则,很多行为型模式都引入了中介者的角色用来隔离通信的两方。

策略模式其实非常简单,就是将实现的算法与使用的用户分离,从而让用户可以自由选择具体的算法。比如要计算税收,不同家庭要采用不同的策略去缴纳所得税。我们不能在程序中硬编码,而是让这个计算过程自由变化,这就是策略模式。

策略模式主要包含两个角色:
第一种,用户,一般是非抽象类。
第二种,策略,抽象类。

//给鸭子增加会飞的功能
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一般是作为调用者,不再有子类。

但是后面发现所有的设计模式的实现方式多多少少都有点类似,大体可以分为类模式和对象模式。也就是说要么通过继承实现扩展,要么通过包含对象来扩展。从而让不同的类结合起来实现一个复杂的系统。而不同的模式之间除了实现方式不同之外,更重要还在于设计模式的意图、使用场景不同。

桥接模式作为一个结构型模式,侧重于接口的隔离,也就是连接两个相互独立的类从而具有更加丰富的功能。
而策略模式作为一个行为型模式,侧重与调用者和被调用者的隔离,解耦上还仅仅是某一个算法的层次。
可以说策略模式是包含在桥接模式中。

原文地址:https://www.cnblogs.com/corineru/p/12031618.html