1. 程式人生 > >《設計模式》學習筆記——策略模式

《設計模式》學習筆記——策略模式

        策略模式(Strategy Pattern)是指有一定行動內容的相對穩定的策略名稱。一個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和一個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。

意圖:     定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。主要解決:     在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。何時使用:     一個系統有許多許多類,而區分它們的只是他們直接的行為。如何解決:     將這些演算法封裝成一個一個的類,任意地替換。關鍵程式碼:

    實現同一個介面。應用例項:     1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。     2、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。      3、JAVA AWT 中的 LayoutManager。優點:     1、演算法可以自由切換。      2、避免使用多重條件判斷。      3、擴充套件性良好。缺點:      1、策略類會增多。      2、所有策略類都需要對外暴露。使用場景:      1、如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為。         那麼使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為。      2、一個系統需要動態地在幾種演算法中選擇一種。      3、如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。注意事項:
    如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

StrategyPattern.h

#pragma once
#include<iostream>
#include<string>

// 抽象策略介面
class StrategyPattern
{
public:
	StrategyPattern() {};
	~StrategyPattern() {};

	virtual void crypt(void) = 0;		// 定義了一個加密策略(介面)
};

// 繼承了抽象策略介面類的具體策略類
// AES對稱加密策略
class AESStrategy:public StrategyPattern
{
public:
	AESStrategy() {};
	~AESStrategy() {};

	virtual void crypt(void)		// 實現了一個加密策略(介面)
	{
		std::cout << "AESStrategy" << std::endl;
	}
};

// 繼承了抽象策略介面類的具體策略類
// DES 對稱加密策略
class DESStrategy :public StrategyPattern
{
public:
	DESStrategy() {};
	~DESStrategy() {};

	virtual void crypt(void)		// 實現了一個加密策略(介面)
	{
		std::cout << "DESStrategy" << std::endl;
	}
};

// 抽象策略介面類的封裝類,被稱為執行環境
class Context
{
public:
	void setStrategy(StrategyPattern * strategyPattern)	// 對外的策略注入介面
	{
		m_strategyPattern = strategyPattern;
	}
	void operatingStrategy(void)							// 對外的策略執行介面
	{
		m_strategyPattern->crypt();//執行對應的策略
		std::cout << "策略執行" << std::endl;
	}
private:
	StrategyPattern * m_strategyPattern= nullptr;
protected:
};

StrategyPattern.cpp

#include "StrategyPattern.h"

mainTest.cpp

#include<iostream>
#include<string>
#include "StrategyPattern.h"

int main(void)
{
	// 建立一個具體的策略
	StrategyPattern* desStrategy = new DESStrategy;
	// 建立一個具體的策略
	StrategyPattern* aesStrategy = new AESStrategy;
	// 建立策略執行環境
	Context* context = new Context;
	// 注入一個策略
	context->setStrategy(desStrategy);
	// 執行策略
	context->operatingStrategy();
	// 注入另一個策略
	context->setStrategy(aesStrategy);
	// 執行策略
	context->operatingStrategy();
	
	delete context;
	delete aesStrategy;
	delete desStrategy;
	system("pause");
	return 0;
}