• 【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一般是作为调用者,不再有子类。

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

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

  • 相关阅读:
    设备上下文-CDC绘图细节
    程序设计思想-1
    消息反射--针对通知消息
    R语言-数据类型与运算符
    背景色与WM_ERASEBKGND
    IDEA 2017.3 新版本中创建 JSF Web 应用程序缺少 web.xml 的解决办法
    在 Fedora 26/27 GNOME 3.24/3.26 环境中安装 FCITX 小企鹅输入法(修订)
    Linux 环境下安装配置 TigerVNC Server 并启用当前会话远程服务(X0VNC)
    关于 gstreamer 和 webrtc 的结合,有点小突破
    VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法
  • 原文地址:https://www.cnblogs.com/corineru/p/12031618.html
Copyright © 2020-2023  润新知