1. 程式人生 > >C++設計模式之策略模式

C++設計模式之策略模式

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

總結:我們會發現一件事,我們如果要新增茶的其他品類的時候,只要寫一個子類就可以,不需要改變其他類的程式碼,所以其他的類都是穩定的,這就體現了我們策略模式的設計原則和目的。