zoukankan      html  css  js  c++  java
  • 行为模式->策略模式

          策略模式(Strategy Pattern)定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。         

           实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。本章我们将介绍一种为了适应算法灵活性而产生的设计模式——策略模式。 从A到B 可以 火车 飞机 骑车 步行各种方法。

            在策略模式中,我们可以定义一些独立的类来封装不同的算法每一个类封装一种具体的算法在这里,每一个封装算法的类我们都可以称之为一种策略(Strategy)  策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开

              什么是Cache的替换算法呢?简单解释一下, 当发生Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获得的数据来替换它。所采用的选择策略就是Cache的替换算法。下面给出相应的UML图。


           ReplaceAlgorithm是一个抽象类,定义了算法的接口,有三个类继承自这个抽象类,也就是具体的算法实现。Cache类中需要使用替换算法,因此维护了一个  ReplaceAlgorithm的对象。这个UML图的结构就是策略模式的典型结构。下面根据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的实现方式直接影响了客户的使用方式,其关键在于如何指定替换算法。

             方式一:直接通过参数指定,传入一个特定算法的指针。

    //Cache需要用到替换算法  
    class Cache  
    {  
    private:  
        ReplaceAlgorithm *m_ra;  
    public:  
        Cache(ReplaceAlgorithm *ra) { m_ra = ra; }  
        ~Cache() { delete m_ra; }  
        void Replace() { m_ra->Replace(); }  
    };  
    如果用这种方式,客户就需要知道这些算法的具体定义。只能以下面这种方式使用,可以看到暴露了太多的细节。

    int main()  
    {  
        Cache cache(new LRU_ReplaceAlgorithm()); //暴露了算法的定义  
        cache.Replace();  
        return 0;  
    }  
              方式二:也是直接通过参数指定,只不过不是传入指针,而是一个标签。这样客户只要知道算法的相应标签即可,而不需要知道算法的具体定义。
    //Cache需要用到替换算法  
    enum RA {LRU, FIFO, RANDOM}; //标签  
    class Cache  
    {  
    private:  
        ReplaceAlgorithm *m_ra;  
    public:  
        Cache(enum RA ra)   
        {   
            if(ra == LRU)  
                m_ra = new LRU_ReplaceAlgorithm();  
            else if(ra == FIFO)  
                m_ra = new FIFO_ReplaceAlgorithm();  
            else if(ra == RANDOM)  
                m_ra = new Random_ReplaceAlgorithm();  
            else   
                m_ra = NULL;  
        }  
        ~Cache() { delete m_ra; }  
        void Replace() { m_ra->Replace(); }  
    };  
    相比方式一,这种方式用起来方便多了。其实这种方式将简单工厂模式与策略模式结合在一起,算法的定义使用了策略模式,而Cache的定义其实使用了简单工厂模式。
    int main()  
    {  
        Cache cache(LRU); //指定标签即可  
        cache.Replace();  
        return 0;  
    }  
    策略模式 是一种定义一系列算法的方法。 所有算法完成相同工作只是实现方式不同。他们以相同方式调用同样接口。 策略模式为每个算法建立了自己类,方便扩展跟单元测试, 策略模式是用来封装算法的。但是实践中我们可以封装任何类型的规则




    关注公众号 海量干货等你
  • 相关阅读:
    bellman-ford -------解决负权边
    为macbook做准备---linux命令
    dijkstra算法---通过边实现松弛
    只有五行的算法--floyd-warshall
    《将博客搬至CSDN》
    Ubuntu x64安装Android studio 全部步骤和问题解决
    无法添加pptp
    Android 随时随地的退出程序
    div中class和id有什么区别?
    CSS学习笔记
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734422.html
Copyright © 2011-2022 走看看