zoukankan      html  css  js  c++  java
  • 设计模式c++(2)——策略模式

    策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客体。

    书上的例子是鸭子,参考blog的例子是缓存算法。参考blog见:https://blog.csdn.net/wuzhekai1985/article/details/6665197

    鸭子:

    class FlyBehavior {
    public:
        virtual void fly() {};
    };
    
    class FlyWithWings : public FlyBehavior {
    public:
        void fly() {
            std::cout<<"Fly With Wings"<<std::endl;
        }
    };
    
    class FlyNoWay : public FlyBehavior {
    public:
        void fly() {
            std::cout<<"Cannot Fly"<<std::endl;
        }
    };
    
    class QuackBehavior {
    public:
        virtual void quack() {};
    };
    
    class Quack : public QuackBehavior {
    public:
        void quack() {
            std::cout<<"Quack"<<std::endl;
        }
    };
    
    class Squeak : public QuackBehavior {
    public:
        void quack() {
            std::cout<<"Squeak"<<std::endl;
        }
    };
    
    class MuteQuack : public QuackBehavior {
    public:
        void quack() {
            std::cout<<"Mute"<<std::endl;
        }
    };
    
    class Duck {
    public:
        Duck() : flyBehavior(nullptr), quackBehavior(nullptr) {};
        void fly() {
            flyBehavior->fly();
        }
        void quack() {
            quackBehavior->quack();
        }
    
    protected:
        FlyBehavior* flyBehavior;
        QuackBehavior* quackBehavior;
    };
    
    class MallardDuck : public Duck{
    public:
        MallardDuck () {
            flyBehavior = new FlyWithWings;
            quackBehavior = new Quack;
        }
        ~MallardDuck() {
            delete flyBehavior;
            delete quackBehavior;
        }
    };

    跟java相比的不同主要在于:

    1. 对于封装的算法的父类型,在作为类成员的时候,要定义为指针。

    2. 其实这条跟java关系不大。就是类成员变量有指针的时候,需要自己实现析构函数。

    跟参考blog的算法的实现区别在于:

    1. 参考blog的算法,构造函数需要传入一个表明类型和算法实现的参数。鸭子这个例子中,不同的鸭子集成鸭子父类,然后在子类的构造函数中初始化父类成员指针。

  • 相关阅读:
    JS跨域访问CORS配置
    在Maven中混用Java和Scala
    Linux下开源可视化工具Caravel安装(包含缺少js解决办法)
    linux环境下NPM安装小结(淘宝镜像)
    Spark学习笔记
    导出HBase数据到Excel(Java代码)
    Spark通过JdbcRdd连接Oracle数据库(scala)
    基于AngularJS+Bootstrap的多文件上传与管理
    Hadoop-1.2.1 安装步骤小结(ubuntu)
    git-remote-https.exe 无法找到入口
  • 原文地址:https://www.cnblogs.com/wangzhao765/p/9158655.html
Copyright © 2011-2022 走看看