Java23種設計模式案例:策略模式(strategy)

 

  現實生活中,咱們要作一件事情或者完成某項工做,每每有不少種途徑。好比咱們出遊,能夠選擇坐汽車,坐火車,土豪點的選擇是坐飛機。還有咱們如今線下的支付方式也有了不少種選擇,之前在外面忘了帶錢的話可能一瓶水都難以買到,如今只要咱們手機在身上,能夠用微信或者支付寶。java

  在軟件設計層面,咱們把各類支付方式叫作策略。若是不考慮設計模式的話,咱們可能會在一個類中用if..else方式來選擇支付方式,即程序員

if(type == 1){
     //微信支付   
   
}else if(type == 2){
     // 支付寶支付

}else if(type == 3){
    //現金支付  

}

        但若是之後要改變支付方式,好比不能用微信支付了,或者新增了其餘支付方式,咱們就要改變這個類,這會帶來代碼維護的麻煩。算法

1、適用場景

  1.若是一個系統裏有不少類,他們只是某個行爲不一樣時,使用策略模式可讓一個對象在許多行爲中選擇一種行爲。編程

  2.一個系統須要動態地在幾種算法中選擇一種。設計模式

  3.有多重轉移條件語句考試使用策略模式。bash

2、優勢和缺點

  1.優勢

  (1).體現了「對修改關閉,對擴展開放」原則,客戶端增長行爲不用修改原有代碼,只要添加一種策略便可。微信

  (2).避免了使用多重轉移語句(if..else if..else)。學習

  (3).提供了能夠替換繼承關係的辦法: 繼承提供了另外一種支持多種算法或行爲的方法。你能夠直接生成一個Context類的子類,從而給它以不一樣的行爲。但這會將行爲硬行編制到 Context中,而將算法的實現與Context的實現混合起來,從而使Context難以理解、難以維護和難以擴展,並且還不能動態地改變算法。最後你獲得一堆相關的類 , 它們之間的惟一差異是它們所使用的算法或行爲。 將算法封裝在獨立的Strategy類中使得你能夠獨立於其Context改變它,使它易於切換、易於理解、易於擴展。測試

  2.缺點

  (1).每添加一個策略就要增長一個類,當策略過可能是會致使類數目龐大。微信支付

  (2).客戶端需明確知道系統有哪些策略可使用,當策略過多時客戶端的學習成本較高。

3、代碼示例

  一、結構圖

  

  從圖中咱們看到,客戶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.... 

相關文章
相關標籤/搜索