策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。下面以高速缓存(Cache)的替换算法为例,实现策略模式。
什么是Cache的替换算法呢单解释一下, 当发生Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获得的数据来替换它。所采用的选择策略就是Cache的替换算法。下面给出相应的UML图。
- //抽象接口
- class ReplaceAlgorithm
- {
- public:
- virtual void Replace() = 0;
- };
- //三种具体的替换算法
- class LRU_ReplaceAlgorithm : public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<“Least Recently Used replace algorithm”<<endl; }
- };
- class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<“First in First out replace algorithm”<<endl; }
- };
- class Random_ReplaceAlgorithm: public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<“Random replace algorithm”<<endl; }
- };
接着给出Cache的定义,这里很关键,Cache的实现方式直接影响了客户的使用方式,其关键在于如何指定替换算法。
方式一:直接通过参数指定,传入一个特定算法的指针。
[cpp] view plain copy print
- //Cache需要用到替换算法
- class Cache
- {
- private:
- ReplaceAlgorithm *m_ra;
- public:
- Cache(ReplaceAlgorithm *ra) { m_ra = ra; }
- ~Cache() { delete m_ra; }
- void Replace() { m_ra->Replace(); }
- };
如果用这种方式,客户就需要知道这些算法的具体定义。只能以下面这种方式使用,可以看到暴露了太多的细节。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!