在有多種算法相似的情況下,我們使用 if...else的話就會有很多缺點:
1.進行多次判斷渣锦,效率極其低下
2.可擴展性太差硝岗,維護起來實在是很費勁
Q:那么如何去解決這個問題呢?
A:使用策略模式泡挺,利用封裝性辈讶,將算法封裝起來,使用的時候去替換就可以了娄猫。
步驟如下:
1.寫一個策略接口
2.寫n個實現(xiàn)類贱除,去實現(xiàn)接口(具體數(shù)量看需求)
3.寫一個Context類,這個類承上啟下
4.決定我們使用的策略媳溺,并靈活運用
說起來步驟來比較費勁月幌,其實代碼實現(xiàn)的話還是蠻容易理解的:
代碼
步驟1:寫個策略接口,這里面我就寫了一個方法悬蔽。大家可以按需求寫
/**
* Created by AceCream on 2017/3/29.
* 策略接口
*/
public interface Strategy {
public String operate(String s);
}
步驟2:寫n個實現(xiàn)類扯躺,去實現(xiàn)接口(具體數(shù)量看需求)
這里寫的比較暴力,三個類都是蝎困,直接使用字符串做參數(shù)這樣比較直觀录语。其實真正使用的時候可以按照自己喜好去改變。
/**
* Created by AceCream on 2017/3/29.
*/
public class OperationOne implements Strategy{
@Override
public String operate(String s) {
s = "第一個策略禾乘!......"+ s;
return s;
}
}
class OperationTwo implements Strategy{
@Override
public String operate(String s) {
s = "第二個策略澎埠!......." + s;
return s;
}
}
class OperationThree implements Strategy{
@Override
public String operate(String s) {
s = "第三個策略!......" + s ;
return s;
}
}
步驟3:寫Context類
這個Context類厲害了始藕!請注意這個類是承上啟下的:
1.構(gòu)造函數(shù)里傳的參數(shù)是具體的策略蒲稳,在我們實例化Context的時候氮趋,我們可以通過改變參數(shù)的方式,去決定我們需要的策略江耀。
2.我在這個類中寫了個執(zhí)行策略的方法“executeStrategy(String s)”
這就意味著剩胁,在客戶端傳具體需要處理的數(shù)據(jù)之前我們已經(jīng)把策略決定好了,傳過來的數(shù)據(jù)可以在我們決定的策略中去執(zhí)行祥国!
/**
* Created by AceCream on 2017/3/29.
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public String executeStrategy(String s){
return strategy.operate(s);
}
}
步驟4:決定我們使用的策略昵观,并靈活運用。其實就是測試一下
package 策略模式;
/**
* Created by AceCream on 2017/3/29.
*/
public class Test {
public static void main(String[] args) {
Context context;
context = new Context(new OperationOne());
System.out.println(context.executeStrategy("草船借箭!"));
context = new Context(new OperationTwo());
System.out.println(context.executeStrategy("過河拆橋!"));
context = new Context(new OperationThree());
System.out.println(context.executeStrategy("順手牽羊!"));
}
}
效果
總結(jié)
這里總結(jié)一下:
所屬:行為型模式
- 意圖:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換系宫。
- 主要解決:在有多種算法相似的情況下索昂,使用 if...else 所帶來的復雜和難以維護。
- 何時使用:一個系統(tǒng)有許多許多類扩借,而區(qū)分它們的只是他們直接的行為椒惨。
- 如何解決:將這些算法封裝成一個一個的類,任意地替換潮罪。
- 關鍵代碼:實現(xiàn)同一個接口康谆。
- 優(yōu)點:
1、算法可以自由切換嫉到。
2沃暗、避免使用多重條件判斷。
3何恶、擴展性良好孽锥。 - 缺點:
1、策略類會增多细层。
2惜辑、所有策略類都需要對外暴露。
參考:
菜鳥教程
大話設計模式