《設計模式》學習筆記——策略模式
阿新 • • 發佈:2018-12-18
策略模式(Strategy Pattern)是指有一定行動內容的相對穩定的策略名稱。一個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和一個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。
意圖: 定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。主要解決: 在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。何時使用: 一個系統有許多許多類,而區分它們的只是他們直接的行為。如何解決: 將這些演算法封裝成一個一個的類,任意地替換。關鍵程式碼:
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;
}