Java設計模式-策略模式詳解

2023-12-01 21:00:27

1.策略模式基本瞭解

策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一組可以相互替換的演演算法,使得使用者端可以根據不同的需求選擇不同的演演算法,將物件和行為分開。

在策略模式中,我們建立了一個策略介面,該介面定義了所有必需的方法。然後,我們建立了實現了該策略介面的具體策略類。最後,使用者端程式碼在執行時根據需求選擇不同的策略。

策略模式的主要優點是它使得演演算法可以自由切換,避免了使用多重條件語句判斷,提高了程式碼的可維護性和擴充套件性。缺點是隨著策略的增多,所有策略類都需要對外暴露,這可能導致使用者端程式碼過於複雜。

if-else也可以實現,但是我們最終的目的不就是為了可維護性高,以及裝逼嘛(開個玩笑),畢竟很多Java的框架原始碼都用到了這種模式,瞭解之後有助於學習這些框架。

2.三要素

  • 策略介面:策略介面定義了所有具體策略類必須實現的方法
  • 具體策略類:具體策略類實現了策略介面,並提供了具體的演演算法實現
  • 上下文類:上下文類持有一個策略介面的參照,並在執行時根據需要呼叫具體策略類的方法

3.使用場景:

即不同的物件對於同一動作有不同的行為的時候。

比如同樣都是支付行為,微信支付沒有優惠,支付寶支付有優惠。支付動作可以定義在策略介面,微信支付和支付寶支付分別實現這個介面,然後支付者作為使用者有一個統一的支付方法,引數就是支付策略介面,那麼選擇支付寶支付,就是策略介面指向支付寶支付實現類,然後呼叫支付方法。

// 策略介面
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中,介面是一種抽象的資料型別,它定義了一組方法的簽名,但沒有提供方法的具體實現。介面可以被類實現,一個類可以實現一個或多個介面。

當你建立一個介面的物件時,你實際上是建立了一個指向具體實現類的參照。這意味著你可以使用介面型別的參照來呼叫實現類中定義的方法。