C++設(shè)計模式之策略模式
首先,我們來看一下策略模式的定義:
策略模式是指定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
我們再來看看類圖:

Snipaste_2018-11-13_20-28-00.png
由此我們知道,策略模式其實就是我們用一個接口,調(diào)用所有的類的入口。
從設(shè)計模式的角度來說,隔離變化,編程到接口
抽象策略角色(Strategy): 抽象策略類。
具體策略角色(ConcreteStrategy):封裝了繼續(xù)相關(guān)的算法和行為。
環(huán)境角色(Context):持有一個策略類的引用,最終給客戶端調(diào)用。
Context 指向 Strategy (由指針實現(xiàn));Context 通過 Strategy 接口,調(diào)用一系列算法;ConcreteStrategy 實現(xiàn)了一系列具體的算法
我們來用一個比較簡單明了的例子來說:
假設(shè)有一杯茶,根據(jù)茶的溫度我們可以分成熱茶、涼茶、常溫茶等等,如果我們要實現(xiàn)這個功能,我們最容易想到的方法就是if--else語句,但是這個恰恰符合了我們策略模式的使用場景。
- Strategy:茶基類
- ConcreteStrategy:各種茶的實現(xiàn)
- Context:提供調(diào)用接口
看代碼:
#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;
}
};
//策略類引用,給客戶端調(diào)用
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;
}
結(jié)果:
I am a hot tea
I am a clod tea
I am a normal tea
總結(jié):我們會發(fā)現(xiàn)一件事,我們?nèi)绻砑硬璧钠渌奉惖臅r候,只要寫一個子類就可以,不需要改變其他類的代碼,所以其他的類都是穩(wěn)定的,這就體現(xiàn)了我們策略模式的設(shè)計原則和目的。