2.策略模式

Posted 不忘初心 方得始终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

设计模式策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

策略模式与工厂模式实践

策略模式与工厂模式实践

策略模式与工厂模式实践

策略模式与工厂模式实践