策略(Strategy)設(shè)計(jì)模式定義了一系列算法,將它們封裝起來(lái),并且可以相互替換使用,從而使得算法可以獨(dú)立于使用它的客戶而變化。
什么是策略模式
策略(Strategy)設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法。策略模式將算法封裝為算法族,從而可以在運(yùn)行時(shí)根據(jù)需要選擇不同的算法。策略模式將算法的定義與其使用分離,使得算法的形式可獨(dú)立于其具體應(yīng)用,這樣就可以在不修改代碼的情況下透明地改變算法。在 Java 中,策略模式通常使用接口或抽象類來(lái)定義不同的策略,然后在其具體實(shí)現(xiàn)類中分別實(shí)現(xiàn)各自的算法。
策略模式的使用場(chǎng)景
策略(Strategy)設(shè)計(jì)模式適用于以下情況:
- 需要在運(yùn)行時(shí)動(dòng)態(tài)地改變對(duì)象的行為。
- 有多個(gè)算法可選,客戶端需要根據(jù)不同的需要選擇不同的算法。
- 一個(gè)類定義了多種行為,并且這些行為在類的方法中以多個(gè)條件語(yǔ)句的形式出現(xiàn)。這時(shí)候可以將每種條件分支轉(zhuǎn)化為一個(gè)獨(dú)立的策略。
策略模式的代碼示例
下面是一個(gè)簡(jiǎn)單的示例,用于演示策略(Strategy)設(shè)計(jì)模式的使用:
// 定義策略接口
interface Strategy {
public int doOperation(int num1, int num2);
}
// 實(shí)現(xiàn)策略接口的具體實(shí)現(xiàn)類:加法策略
class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
// 實(shí)現(xiàn)策略接口的具體實(shí)現(xiàn)類:減法策略
class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
// 實(shí)現(xiàn)策略接口的具體實(shí)現(xiàn)類:乘法策略
class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
// 定義上下文對(duì)象
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
// 客戶端代碼
public class Client {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
在上面的代碼中,我們定義了一個(gè) Strategy 接口,該接口用于定義不同的算法。我們實(shí)現(xiàn)了三個(gè)具體的策略類:OperationAdd、OperationSubtract 和 OperationMultiply,分別對(duì)應(yīng)加法、減法和乘法算法。每個(gè)具體策略類都實(shí)現(xiàn)了 Strategy 接口中的方法。
我們還定義了一個(gè) Context 上下文對(duì)象,它包含了一個(gè)策略對(duì)象,可以根據(jù)不同的策略執(zhí)行不同的算法。在 Context 對(duì)象中,定義了一個(gè) executeStrategy 方法,根據(jù)當(dāng)前策略對(duì)象執(zhí)行相應(yīng)的算法。
在客戶端代碼中,我們首先創(chuàng)建了一個(gè) Context 對(duì)象,并使用 OperationAdd 策略執(zhí)行加法算法。然后我們重新定義了 Context 對(duì)象,并使用 OperationSubtract 策略執(zhí)行減法算法。最后,我們又重新定義了 Context 對(duì)象,并使用 OperationMultiply 策略執(zhí)行乘法算法。
代碼的運(yùn)行結(jié)果為:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
這是因?yàn)槲覀兎謩e使用了三個(gè)不同的策略(加法、減法和乘法),并將它們用于 Context 對(duì)象中執(zhí)行計(jì)算。最后,我們打印了每個(gè)計(jì)算的結(jié)果。
策略模式的實(shí)際應(yīng)用
-
Spring框架:Spring框架中的依賴注入(DI)和控制反轉(zhuǎn)(IOC)機(jī)制允許在運(yùn)行時(shí)動(dòng)態(tài)選擇不同的實(shí)現(xiàn)。通過(guò)在配置文件中配置不同的策略,可以在不修改代碼的情況下實(shí)現(xiàn)選擇不同的策略。
-
Hibernate框架:Hibernate框架中的查詢語(yǔ)言HQL(Hibernate Query Language)提供了不同的查詢策略,通過(guò)選擇不同的查詢策略,可以根據(jù)需求選擇合適的查詢方式,以提高查詢效率。
-
Java集合框架:Java集合框架中的排序方法(Comparator)接口是策略模式的典型示例。使用排序策略接口,可以在不修改集合類的情況下,根據(jù)不同的條件進(jìn)行排序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-608567.html
總結(jié)
策略(Strategy)設(shè)計(jì)模式提供了一種能夠在運(yùn)行時(shí)動(dòng)態(tài)地改變對(duì)象行為的解決方案。在策略設(shè)計(jì)模式中,將算法的實(shí)現(xiàn)與算法的使用者相分離,從而可以根據(jù)需要選擇不同的算法。通過(guò)使用接口或抽象類來(lái)定義各種策略,可以在運(yùn)行時(shí)動(dòng)態(tài)選擇合適的策略。這使得算法的改變能夠以透明的方式進(jìn)行,而不會(huì)影響客戶端代碼的實(shí)現(xiàn)。在實(shí)際軟件開(kāi)發(fā)中,策略設(shè)計(jì)模式被廣泛應(yīng)用,特別是在需要在運(yùn)行時(shí)改變對(duì)象行為的場(chǎng)景中。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-608567.html
到了這里,關(guān)于Java設(shè)計(jì)模式之策略(Strategy)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!