感受能夠和工廠模式一塊兒用:它定義了算法家族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化,不會影響到使用算法的客戶.策略模式是一種定義一系列算法的方法,從概念上看,全部這些算法完成的都是相同的工做,只是實現不一樣,它能夠以相同的方式調用全部的算法,減小了各類算法類與使用算法類之間的耦合.ios
策略模式的 基類 層次爲Context定義了一系列的可供重用的算法或行爲。策略模式的優勢是簡化了單元測試,由於每一個算法都有本身的類,能夠經過本身的接口單獨測試.算法
當不一樣的行爲堆砌在一個類中時,就很難避免使用條件語句來選擇合適的行爲。將這些行爲封裝在一個一個獨立的Strategy類中,能夠在使用這些行爲的類中消除條件語句.單元測試
策略模式就是用來封裝算法的,但在實踐中,咱們發現能夠用它來封裝幾乎任何類型的規則.測試
只要在分析過程當中聽到須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式處理這話總變化的可能性.spa
在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉給策略模式的Context對象.code
此處和工廠模式很相似的一個實例:orm
#pragma once class CashSuper { public: virtual double acceptCash(double money)=0; CashSuper(void); ~CashSuper(void); };
#pragma once //不打折扣的狀況 #include "cashsuper.h" class CashNormal : public CashSuper { public: virtual double acceptCash(double money) { return money; } CashNormal(void); ~CashNormal(void); };
#pragma once //打折扣的狀況 #include "cashsuper.h" class CashRebate : public CashSuper { public: CashRebate(double rebate=1.0):moneyRebate(rebate){} virtual double acceptCash(double money) { return money*moneyRebate; } ~CashRebate(void); private: double moneyRebate; };
#pragma once //滿多少減多少的狀況 #include "cashsuper.h" class CashReturn : public CashSuper { public: CashReturn(double condition=0.0,double returns =0.0):moneyCondition(condition),moneyReturn(returns){} virtual double acceptCash(double money) { double result = money; if(money>=moneyCondition) result = money-(money/moneyCondition)*moneyReturn; return result; } ~CashReturn(void); private: double moneyCondition; double moneyReturn; };
#pragma once #include "CashSuper.h" #include "CashNormal.h" #include "CashRebate.h" #include "CashReturn.h" class CashContext { public: CashContext(int type) { switch(type) { case 1: cs = new CashNormal(); break; case 2: cs = new CashReturn(300,100); break; case 3: cs = new CashRebate(0.8); break; } } double GetResult(double money) { return cs->acceptCash(money); } ~CashContext(void); private: CashSuper *cs; };
調用:對象
#include "stdafx.h" #include <iostream> #include "CashContext.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //1.原價 CashContext *csupe = new CashContext(1); cout<<csupe->GetResult(56.4)<<endl; //2.滿300返100 csupe = new CashContext(2); cout<<csupe->GetResult(300)<<endl; //3.打八折 csupe = new CashContext(3); cout<<csupe -> GetResult(400)<<endl; return 0; }
輸出結果: 56.4 200 320blog