1. 程式人生 > >策略模式(C++)

策略模式(C++)

type include name quic 構造 排序算法 插入 實現 pla

  策略模式:把一系列算法封裝起來,使之可以相互替換。這樣就可以使算法獨立於客戶端變化。

  如我們有很多排序算法,但是在不通的環境中,需要使用不同算法,那就可以定義一個抽象類,提供統一的接口,然後在各個排序算法繼承抽象類,並實現該子類的排序算法 ,再定義一個項目類,通過構造函數傳入不同算法類的對象或是模板實例化來表示在不同的項目中用使用不同的算法。哎呀,廢話真多,現在比較流行快餐文化哈,那我們直接看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。

策略模式(C++)