策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一組可以相互替換的演演算法,使得使用者端可以根據不同的需求選擇不同的演演算法,將物件和行為分開。
在策略模式中,我們建立了一個策略介面,該介面定義了所有必需的方法。然後,我們建立了實現了該策略介面的具體策略類。最後,使用者端程式碼在執行時根據需求選擇不同的策略。
策略模式的主要優點是它使得演演算法可以自由切換,避免了使用多重條件語句判斷,提高了程式碼的可維護性和擴充套件性。缺點是隨著策略的增多,所有策略類都需要對外暴露,這可能導致使用者端程式碼過於複雜。
if-else也可以實現,但是我們最終的目的不就是為了可維護性高,以及裝逼嘛(開個玩笑),畢竟很多Java的框架原始碼都用到了這種模式,瞭解之後有助於學習這些框架。
即不同的物件對於同一動作有不同的行為的時候。
比如同樣都是支付行為,微信支付沒有優惠,支付寶支付有優惠。支付動作可以定義在策略介面,微信支付和支付寶支付分別實現這個介面,然後支付者作為使用者有一個統一的支付方法,引數就是支付策略介面,那麼選擇支付寶支付,就是策略介面指向支付寶支付實現類,然後呼叫支付方法。
// 策略介面
interface Strategy {
void execute();
}
// 具體策略類1
class ConcreteStrategy1 implements Strategy {
@Override
public void execute() {
System.out.println("執行策略1");
}
}
// 具體策略類2
class ConcreteStrategy2 implements Strategy {
@Override
public void execute() {
System.out.println("執行策略2");
}
}
// 上下文類
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
// 使用策略模式
public class Main {
public static void main(String[] args) {
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
Context context = new Context(strategy1);
context.executeStrategy();
context.setStrategy(strategy2);
context.executeStrategy();
}
}
知識點補充:
在Java中,介面是一種抽象的資料型別,它定義了一組方法的簽名,但沒有提供方法的具體實現。介面可以被類實現,一個類可以實現一個或多個介面。
當你建立一個介面的物件時,你實際上是建立了一個指向具體實現類的參照。這意味著你可以使用介面型別的參照來呼叫實現類中定義的方法。