現實生活中,咱們要作一件事情或者完成某項工做,每每有不少種途徑。好比咱們出遊,能夠選擇坐汽車,坐火車,土豪點的選擇是坐飛機。還有咱們如今線下的支付方式也有了不少種選擇,之前在外面忘了帶錢的話可能一瓶水都難以買到,如今只要咱們手機在身上,能夠用微信或者支付寶。java
在軟件設計層面,咱們把各類支付方式叫作策略。若是不考慮設計模式的話,咱們可能會在一個類中用if..else方式來選擇支付方式,即程序員
if(type == 1){ //微信支付 }else if(type == 2){ // 支付寶支付 }else if(type == 3){ //現金支付 }
但若是之後要改變支付方式,好比不能用微信支付了,或者新增了其餘支付方式,咱們就要改變這個類,這會帶來代碼維護的麻煩。算法
1.若是一個系統裏有不少類,他們只是某個行爲不一樣時,使用策略模式可讓一個對象在許多行爲中選擇一種行爲。編程
2.一個系統須要動態地在幾種算法中選擇一種。設計模式
3.有多重轉移條件語句考試使用策略模式。bash
(1).體現了「對修改關閉,對擴展開放」原則,客戶端增長行爲不用修改原有代碼,只要添加一種策略便可。微信
(2).避免了使用多重轉移語句(if..else if..else)。學習
(3).提供了能夠替換繼承關係的辦法: 繼承提供了另外一種支持多種算法或行爲的方法。你能夠直接生成一個Context類的子類,從而給它以不一樣的行爲。但這會將行爲硬行編制到 Context中,而將算法的實現與Context的實現混合起來,從而使Context難以理解、難以維護和難以擴展,並且還不能動態地改變算法。最後你獲得一堆相關的類 , 它們之間的惟一差異是它們所使用的算法或行爲。 將算法封裝在獨立的Strategy類中使得你能夠獨立於其Context改變它,使它易於切換、易於理解、易於擴展。測試
(1).每添加一個策略就要增長一個類,當策略過可能是會致使類數目龐大。微信支付
(2).客戶端需明確知道系統有哪些策略可使用,當策略過多時客戶端的學習成本較高。
從圖中咱們看到,客戶context擁有成員變量strategy(策略),至於須要用到那種策略,咱們能夠在構造器中指定。策略模式的定義是:定義算法族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。這算法體現了幾個設計原則,第1、把變化的代碼從不變的代碼中分離出來;第2、針對接口編程而不是具體類(定義了策略接口);第3、多用組合,少用繼承(客戶經過組合方式使用策略)。
下面以公司職員的工做內容爲例介紹策略模式
定義策略接口,就是工做內容
interface DoWorking{ public void comeOn(); }
編碼類實現策略接口DoWorking
class Coding implements DoWorking{ public void comeOn(){ System.out.println("I'm coding...."); } }
審計類實現策略接口DoWorking
class auditing implements DoWorking{ public void comeOn(){ System.out.println("我正在審計財務報表...."); } }
招聘類實現策略接口DoWorking
class recruiting implements DoWorking{ public void comeOn(){ System.out.println("I'm recruting new employees..."); } }
定義客戶端職員類,其中包含成員變量doWorking(策略),以及開展工做的方法startWork()
class Employee{ public DoWorking doWorking;//組合的方式使用策略 public void startWork(){ doWorking.comeOn(); } }
客戶端程序員繼承職員類
class Coder extend Employee{ public Coder(){ doWorking = new Coding();//使用編碼策略 } }
測試程序員調用策略
public class StrategyClient { public static void main(String[] args){ Employee coder = new Coder(); coder.startWork(); } }
運行結果:I'm coding....