首页 > 代码库 > 2.策略模式

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;}

 

2.策略模式