C++設計模式之策略模式
阿新 • • 發佈:2018-11-23
C++設計模式之策略模式
首先,我們來看一下策略模式的定義:
策略模式是指定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。
我們再來看看類圖:
由此我們知道,策略模式其實就是我們用一個介面,呼叫所有的類的入口。
從設計模式的角度來說,隔離變化,程式設計到介面
抽象策略角色(Strategy): 抽象策略類。 具體策略角色(ConcreteStrategy):封裝了繼續相關的演算法和行為。 環境角色(Context):持有一個策略類的引用,最終給客戶端呼叫。 Context 指向 Strategy (由指標實現);Context 通過 Strategy 介面,呼叫一系列演算法;ConcreteStrategy 實現了一系列具體的演算法
我們來用一個比較簡單明瞭的例子來說:
假設有一杯茶,根據茶的溫度我們可以分成熱茶、涼茶、常溫茶等等,如果我們要實現這個功能,我們最容易想到的方法就是if–else語句,但是這個恰恰符合了我們策略模式的使用場景。
- Strategy:茶基類
- ConcreteStrategy:各種茶的實現
- Context:提供呼叫介面
看程式碼:
#include<iostream> using namespace std; //定義基類茶,抽象策略類 class Tea { public: virtual void temperature() = 0; }; //熱茶、涼茶、常溫 class Hot_Tea:public Tea { public: void temperature() { cout<<"I am a hot tea"<<endl; } }; class Cold_Tea:public Tea { public: void temperature() { cout<<"I am a clod tea"<<endl; } }; class Normal_Tea:public Tea { public: void temperature() { cout<<"I am a normal tea"<<endl; } }; //策略類引用,給客戶端呼叫 class Contex { private: Tea* tea; public: Contex(Tea* t) { tea = t; } void point() { tea->temperature(); } }; int main() { Contex* hot = new Contex(new Hot_Tea); Contex* col = new Contex(new Cold_Tea); Contex* nor = new Contex(new Normal_Tea); hot->point(); col->point(); nor->point(); return 0; }
結果:
I am a hot tea
I am a clod tea
I am a normal tea
總結:我們會發現一件事,我們如果要新增茶的其他品類的時候,只要寫一個子類就可以,不需要改變其他類的程式碼,所以其他的類都是穩定的,這就體現了我們策略模式的設計原則和目的。