1. 程式人生 > >學習設計模式-策略模式

學習設計模式-策略模式

策略模式

能做什麼用

舉個例子:在登陸CSDN時候發現,有賬號密碼登陸、微信登陸等等好多種方式可以登入,在程式設計師開發時候無法避免的就是,為每一種登入方式寫一種驗證登入成功的方法,比如:

if (userName == "DifferentWang" && password == "differ123456"){
    // 提示登入成功!
}

這個賬號密碼登入的驗證方式是不太適合用來驗證微信登入的(不說的那麼複雜,至少微信登入沒輸入使用者名稱和密碼),那自然要在寫一個對應微信驗證登入的方法。
那程式碼可能是這樣的:在一個ValidateLogin .java的類中

public class ValidateLogin {
    // 1、賬號密碼登入
    public void usernameAndPassword(String username, String password){
        // 驗證邏輯
    }

    // 2、微信登入
    public void wechatLogin(){
        // 驗證邏輯
    }

    // 3、微博登入
    // 登入方法...
 
    // n、其他登入方法
    // ...
}

當呼叫時,

// ...
ValidateLogin validateLogin = new
ValidateLogin(); validateLogin.wechatLogin(); // ...

在這裡,重點不是如何實現各種登入方式的驗證,也不是通過策略模式可以減少程式碼量。重點是,如果其他登入方式由你的同事編寫,那我不想讓他改動我的ValidateLogin類,但是其他方式又都屬於驗證登入,理應寫在這個類中,我該怎麼辦?
呼~~~終於繞回來啦······(感覺這個例子好牽強,後給說應用場景就能更深入理解啦!)
接下來,有請我們的“策略模式”閃亮登場。music~

策略模式:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。
如: 1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。 2、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。 3、JAVA AWT 中的 LayoutManager。
—— 菜鳥教程

優點:

1、各種策略可以自由替換
2、避免了多重條件判斷(if…else if … else if… )
3、擴充套件性好

缺點

1、會產生很多策略類
2、所有策略類都要向外暴露

假設場景

開發一個簡單計算器,只提供了有限的運算操作,但是該計算器可以讓開發者進行二次開發,讓其自己新增比如開方等等其他運算方法。——使用策略模式

需要怎麼做

1、定義一個介面類

public interface Operation {
    int doOperation(int num1, int num2);
}

2、實現介面,在每個實現類的doOperation()中實現對應操作的邏輯
a.實現加法類

public class AddOperation implements Operation {
    @Override
    int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

a.實現減法類

public class SubOperation implements Operation {
    @Override
    int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

3、定義計算器類

public class Calculator {
    private Operation operation;

    void setOperator(Operation operation) {
        this.operation = operation;
    }
    
    int doOperation(int num1, int num2) {
        return this.operation.doOperation(int num1, int num2);
    }
}

4、呼叫計算器

public class CalculatorDemo
    public static void main(String[] arg) {
        Calculator calculator = new Calculator();
        calculator.setOperation(new AddOperation());
        int result = calculator.doOperation(1,2);
        System.out.println("結果為:" + result);
    }
}

可以用在什麼場景下

1、如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為。
2、一個系統需要動態地在幾種演算法中選擇一種。(比如,計算器的加減乘除)
3、如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

注意:

如果一個系統的策略多於四個,就需要考慮使用混合模式1,解決策略類膨脹的問題。


  1. 混合使用多種模式靈活搭配能讓系統更健壯,靈活性更高,擴充套件性更強。 ↩︎