概念
政策模式(Strategy模式)是行為模式之一,它對一系列的算法加以封裝,為所有算法定義一個抽象的算法接口,并通過繼承該抽象算法接口對所有的算法加以封裝和實作,具體的算法選擇交由用戶端決定(政策)。Strategy模式主要用來平滑地處理算法的切換 。
角色和職責
這裡的關鍵就是将算法的邏輯抽象接口(DoAction) 封裝到一個類中(Context), 再通過委托的方式将具體的算法實作委托給具體的Strategy 類來實作(ConcreteStrategeA類)。
Strategy:
政策(算法)抽象。
ConcreteStrategy:
各種政策(算法)的具體實作。
Context:
政策的外部封裝類,或者說政策的容器類。根據不同政策執行不同的行為。政策由外部環境決定。
适用于:準備一組算法,并将每一個算法封裝起來,使得它們可以互換。
政策模式優缺點
優點:
1. 政策模式提供了管理相關的算法族的辦法。政策類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類裡面,進而避免重複的代碼。
2. 政策模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用政策模式,那麼使用算法或行為的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,進而不可能再獨立演化。繼承使得動态改變算法或行為變得不可能。
3. 使用政策模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重轉移語句裡面,比使用繼承的辦法還要原始和落後。
缺點:
1. 用戶端必須知道所有的政策類,并自行決定使用哪一個政策類。這就意味着用戶端必須了解這些算法的差別,以便适時選擇恰當的算法類。換言之,政策模式隻适用于用戶端知道所有的算法或行為的情況。
2. 政策模式造成很多的政策類。有時候可以通過把依賴于環境的狀态儲存到用戶端裡面,而将政策類設計成可共享的,這樣政策類執行個體可以被不同用戶端使用。換言之,可以使用享元模式來減少對象的數量。
案例
//Symmetric encryption
class Strategy
{
public:
virtual void SymEncrypt() = 0;
};
class Des : public Strategy
{
public:
virtual void SymEncrypt()
{
cout << "Des 加密" << endl;
}
};
class AES : public Strategy
{
public:
virtual void SymEncrypt()
{
cout << "AES 加密" << endl;
}
};
class Context
{
public:
Context(Strategy *strategy)
{
p = strategy;
}
void Operator()
{
p->SymEncrypt();
}
private:
Strategy *p;
};
//算法的實作 和 用戶端的使用 解耦合
//使得算法變化,不會影響用戶端
void main()
{
/* 不符合開閉原則
Strategy *strategy = NULL;
strategy = new AES;
strategy->SymEncrypt();
delete strategy;
strategy = new Des;
strategy->SymEncrypt();
delete strategy;
*/
Strategy *strategy = NULL;
Context *ctx = NULL;
strategy = new AES;
ctx = new Context(strategy);
ctx->Operator();
delete strategy;
delete ctx;
cout<<"hello..."<<endl;
system("pause");
return ;
}
關注公衆号:《碼之有道》,一起聊遊戲全棧開發!
1、公衆号回複:【教程】擷取零基礎遊戲開發用戶端+服務端全套教程。
2、公衆号回複:【實戰】擷取企業級實戰項目。
3、公衆号回複:【資料】擷取大學四年整理的所有自學資料。