• 策略模式(C++)


      策略模式:把一系列算法封装起来,使之可以相互替换。这样就可以使算法独立于客户端变化。

      如我们有很多排序算法,但是在不通的环境中,需要使用不同算法,那就可以定义一个抽象类,提供统一的接口,然后在各个排序算法继承抽象类,并实现该子类的排序算法 ,再定义一个项目类,通过构造函数传入不同算法类的对象或是模板实例化来表示在不同的项目中用使用不同的算法。哎呀,废话真多,现在比较流行快餐文化哈,那我们直接看UML类图吧:

    上面是类图,下面我们看代码,分为通过传入对象指针指定和通过模板实例化指定。

    方法1:通过传入对象指针指定:

    #include <iostream>
    using namespace std;
    
    class Sort  //排序算法类
    {
    public:
        virtual void userSort() = 0;//使用排序
        virtual ~Sort(){};
    };
    
    class BubbleSort : public Sort    //冒泡排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"BubbleSort::userSort()"<<endl;
        }
    };
    
    class SelectSort : public Sort    //选择排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"SelectSort::userSort()"<<endl;
        }
    };
    
    class InsertSort : public Sort    //插入排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"InsertSort::userSort()"<<endl;
        }
    };
    
    class QuickSort : public Sort    //快速排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"QuickSort::userSort()"<<endl;
        }
    };
    
    class Project    //项目类,来根据不同的对象替换不同的算法
    {
    private:
        Sort* m_sort;
    public:
        Project(){}
    
        Project(Sort* sort):m_sort(sort)
        {
        }
    
        void replaceSort()
        {
            m_sort->userSort();
        }
    
        ~Project()
        {
            if(NULL != m_sort)
            {
                delete m_sort;
            }
        }
    };
    
    int main(int argc, char** argv)
    {
        
        Sort* sort = new InsertSort(); //此处还可以new其他算法类
        Project pro(sort);
        pro.replaceSort();
            
        return 0;
    }

    输出结果如下:

    方法2:通过模板实例化实现

    #include <iostream>
    using namespace std;
    
    class Sort  //排序算法类
    {
    public:
        virtual void userSort() = 0;//使用排序
        virtual ~Sort(){};
    };
    
    class BubbleSort : public Sort    //冒泡排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"BubbleSort::userSort()"<<endl;
        }
    };
    
    class SelectSort : public Sort    //选择排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"SelectSort::userSort()"<<endl;
        }
    };
    
    class InsertSort : public Sort    //插入排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"InsertSort::userSort()"<<endl;
        }
    };
    
    class QuickSort : public Sort    //快速排序算法类
    {
    public:
        virtual void userSort()
        {
            cout<<"QuickSort::userSort()"<<endl;
        }
    };
    
    template<typename T>
    class Project    //项目类,来根据不同的对象替换不同的算法
    {
    private:
        T m_sort;
    public:
        Project(){}    
        
        void replaceSort()
        {
            m_sort.userSort();
        }
    };
    
    
    int main(int argc, char** argv)
    {    
        Project<QuickSort> pro;//此处还可以实例化其他算法
        pro.replaceSort();
        
        return 0;
    }

    输出结果如下:

      其实上面代码有点啰嗦了,通过对象指针和模板实例化实现仅仅Project类和main函数存在一些区别,就将就下吧!!!!!

      以上代码在VC6.0上运行OK。

  • 相关阅读:
    网站架构探索(3)负载均衡的方式
    架构师之路(6)OOD的开闭原则
    也谈IT人员流失问题 王泽宾
    技术体系的选择之Java篇
    网站架构探索(2)CDN基本常识
    设计模式之单例模式
    网站架构探索(1)序言 王泽宾
    架构师之路(39)IoC框架
    发展之道:简单与专注
    修me30打印机
  • 原文地址:https://www.cnblogs.com/huiz/p/8250883.html
Copyright © 2020-2023  润新知