一 場(chǎng)景
在軟件開發(fā)中佩微,有許多算法可以實(shí)現(xiàn)某一功能佛纫,如需要提供多種查找算法妓局,可以將這些算法寫到一個(gè)類中,在該類中提供多個(gè)方法雳旅,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的算法跟磨;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過if…else…等條件判斷語句來進(jìn)行選擇攒盈。但是如果需要增加一種新的算法抵拘,需要修改封裝算法類的源代碼;更換算法型豁,也需要修改客戶端調(diào)用代碼僵蛛。在這個(gè)算法類中封裝了大量算法,該類代碼將較復(fù)雜迎变,維護(hù)較為困難充尉。于是我們策略模式便登場(chǎng)了。
二 定義
策略模式:定義一系列算法衣形,將每一個(gè)算法封裝起來驼侠,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化谆吴。
這個(gè)模式涉及到三個(gè)角色:
- 環(huán)境(Context)角色:持有一個(gè)Strategy的引用倒源。
- 抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)句狼。此角色給出所有的具體策略類所需的接口笋熬。
-
具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為。
Strategy:
package headFirst.strategyPattern;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 22:56
*/
public interface Strategy<T> {
public Boolean diffStrategy(T source,T target);
}
ConcreteStrategy:
package headFirst.strategyPattern;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 22:59
*/
public class IntStrategy implements Strategy<Integer> {
public Boolean diffStrategy(Integer source, Integer target) {
return source == target;
}
}
//-----------------------------
package headFirst.strategyPattern;
import java.util.List;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 23:11
*/
public class ListStrategy extends StringStrategy {
public Boolean diffStrategy(List<String> source, List<String> target) {
String sourceString = null;
String targetString =null;
return super.diffStrategy(sourceString,targetString);
}
}
//--------------------------
package headFirst.strategyPattern;
import java.util.List;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 23:13
*/
public class StringStrategy implements Strategy<String> {
public Boolean diffStrategy(String source, String target) {
return source.equals(target);
}
}
Context:
package headFirst.strategyPattern;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 22:52
*/
public class Diff {
private Strategy strategy;
public Diff(Strategy strategy){
this.strategy = strategy;
}
public void diffResult(Object source, Object target){
if(strategy.diffStrategy(source,target)){
System.out.println("is same");
}else {
System.out.println("is not same");
}
}
}
test:
package headFirst.strategyPattern;
/**
* @author zhaokai008@ke.com
* @date 2019-06-26 22:36
*/
public class StartegyPatternTest {
public static void main(String [] args ){
Strategy strategy = new IntStrategy();
Strategy strategy1 = new StringStrategy();
Diff intDiff = new Diff(strategy);
intDiff.diffResult(1,2);
Diff stringDiff = new Diff(strategy1);
stringDiff.diffResult("1","1");
}
}
//------------input:
is not same
is same
三 優(yōu)點(diǎn)
- 對(duì)“開閉原則”的完美支持腻菇,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為胳螟,也可以靈活地增加新的算法或行為昔馋。
- 策略模式提供了管理相關(guān)的算法族的辦法。
- 策略模式提供了可以替換繼承關(guān)系的辦法糖耸。
- 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句
四 缺點(diǎn)
- 客戶端必須知道所有的策略類秘遏,并自行決定使用哪一個(gè)策略類