zoukankan      html  css  js  c++  java
  • 2.策略模式

    1.策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互交换。策略模式让算法独立于使用它的客户而独立变换。

     例:高速缓存交换算法

    //交换算法抽象类
    class ReplaceAlgorithm {
    public:
        virtual void Replace() = 0;
    };
    
    //具体算法
    class LRU_ReplaceAlgorithm : public ReplaceAlgorithm {
    public:
        virtual void Replace() {
            std::cout << "Least Recently Used replace algorithm" << std::endl;
        }
    };
    
    class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm {
    public:
        virtual void Replace() {
            std::cout << "First in First out replace algorithm" << std::endl;
        }
    };
    
    class Random_ReplaceAlgorithm : public ReplaceAlgorithm {
    public:
        virtual void Replace() {
            std::cout << "Random replace algorithm" << std::endl;
        }
    };

      给出Cache的定义,直接影响了客户的使用方式,关键在于如何指定算法

      (1)直接通过参数指定,传入一个特定算法指针,如果使用这种方式,用户就要知道算法的定义  

    class Cache {
    public:
        Cache(ReplaceAlgorithm* ra) : m_ra(ra) {}
        ~Cache() { delete m_ra; }
        void Replace() { m_ra->Replace(); }
    private:
        ReplaceAlgorithm* m_ra;
    };
    
    int main() {
        Cache cache(new LRU_ReplaceAlgorithm);
        cache.Replace();
        return 0;
    }

      (2)直接通过参数指定,但是不是传入指针,而是传入一个标签

        算法的定义使用策略模式,Cache的定义使用了简单工厂模式  

    enum RA {LRU, FIFO, RANDOM};
    class Cache {
    public:
        Cache(enum RA ra) {
            if (LRU == ra) { 
                m_ra =  new LRU_ReplaceAlgorithm; 
            }
            if (FIFO == ra) { 
                m_ra =  new FIFO_ReplaceAlgorithm; 
            }
            if (RANDOM == ra) {
                m_ra = new Random_ReplaceAlgorithm;
            }
            m_ra = nullptr;
        }
        ~Cache() { delete m_ra; }
        void Replace() {
            m_ra->Replace();
        }
    private:
        ReplaceAlgorithm* m_ra;
    };
    
    int main() {
        Cache cache(LRU);
        cache.Replace();
        return 0;
    }

      (3)用模板实现  

    template <typename T> class Cache {
    public:
        Cache() { }
        ~Cache() { }
        void Replace() {
            m_ra.Replace();
        }
    private:
        T m_ra;
    };
    
    int main() {
        Cache<Random_ReplaceAlgorithm> cache;
        cache.Replace();
        return 0;
    }
  • 相关阅读:
    c#数据类型
    遮罩层
    图片轮播
    js 获取浏览器高度和宽度值
    bootstrap、jquery
    洛谷P1442 铁球落地 题解
    HDU3016 Man Down 题解
    POJ2892 Tunnel Warfare 题解
    HDU2795 Billboard 题解
    CF920F SUM and REPLACE 题解
  • 原文地址:https://www.cnblogs.com/csqtech/p/5862473.html
Copyright © 2011-2022 走看看