Java設(shè)計模式-策略模式詳解
1.策略模式基本了解
策略模式(Strategy Pattern)是一種行為型設(shè)計模式,它定義了一組可以相互替換的算法,使得客戶端可以根據(jù)不同的需求選擇不同的算法,將對象和行為分開。
在策略模式中,我們創(chuàng)建了一個策略接口,該接口定義了所有必需的方法。然后,我們創(chuàng)建了實現(xiàn)了該策略接口的具體策略類。最后,客戶端代碼在運行時根據(jù)需求選擇不同的策略。
策略模式的主要優(yōu)點是它使得算法可以*切換,避免了使用多重條件語句判斷,提高了代碼的可維護性和擴展性。缺點是隨著策略的增多,所有策略類都需要對外暴露,這可能導(dǎo)致客戶端代碼過于復(fù)雜。
if-else也可以實現(xiàn),但是我們最終的目的不就是為了可維護性高,以及裝逼嘛(開個玩笑),畢竟很多Java的框架源代碼都用到了這種模式,了解之后有助于學(xué)習(xí)這些框架。
2.三要素
- 策略接口:策略接口定義了所有具體策略類必須實現(xiàn)的方法
- 具體策略類:具體策略類實現(xiàn)了策略接口,并提供了具體的算法實現(xiàn)
- 上下文類:上下文類持有一個策略接口的引用,并在運行時根據(jù)需要調(diào)用具體策略類的方法
3.使用場景:
即不同的對象對于同一動作有不同的行為的時候。
比如同樣都是支付行為,微信支付沒有優(yōu)惠,支付寶支付有優(yōu)惠。支付動作可以定義在策略接口,微信支付和支付寶支付分別實現(xiàn)這個接口,然后支付者作為使用者有一個統(tǒng)一的支付方法,參數(shù)就是支付策略接口,那么選擇支付寶支付,就是策略接口指向支付寶支付實現(xiàn)類,然后調(diào)用支付方法。
// 策略接口
interface Strategy {
void execute();
}
// 具體策略類1
class ConcreteStrategy1 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略1");
}
}
// 具體策略類2
class ConcreteStrategy2 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略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中,接口是一種抽象的數(shù)據(jù)類型,它定義了一組方法的簽名,但沒有提供方法的具體實現(xiàn)。接口可以被類實現(xiàn),一個類可以實現(xiàn)一個或多個接口。
當(dāng)你創(chuàng)建一個接口的對象時,你實際上是創(chuàng)建了一個指向具體實現(xiàn)類的引用。這意味著你可以使用接口類型的引用來調(diào)用實現(xiàn)類中定義的方法。