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