為啥先說策略模式呢套硼,當然是聽著策略這個詞比較厲害了卡辰,開玩笑,其實是它比較簡單邪意,好理解九妈!
1. 定義
策略(Strategy)模式,定義一系列算法雾鬼,并將每個算法封裝起來萌朱,使它們可以被統(tǒng)一使用,且算法的改變不影響具體使用方策菜。
2. 優(yōu)點
1)可以避免多重條件語句晶疼,如if...else語句,switch...case語句等
2)算法可重用又憨,避免重復的代碼實現(xiàn)翠霍,也可以把算法族轉移到公共父類中
3)可以提供相同行為的不同實現(xiàn),使用方可以根據(jù)自己的需求自由選擇
4)提供了對開閉原則的完美支持蠢莺,可以不修改原代碼的情況下寒匙,靈活添加新算法
3. 缺點
1)使用方需要了解每個策略算法的含義和區(qū)別,以便選擇最合適的
2)策略模式可能會造成有很多的策略類躏将,增加了維護的難度
4. 結構
- 抽象策略類:定義的一個公共接口锄弱,供各個算法實現(xiàn)這個接口
- 具體策略類:實現(xiàn)抽象策略類定義接口,提供具體的算法實現(xiàn)
- 環(huán)境類:對一個策略類的引用
5. 實現(xiàn)
我們做一道菜呢祸憋,可能會有很多種做法会宪,比如煎、蒸夺衍、煮等
今天媽媽做什么樣的菜呢狈谊,是煎呢,還是煮呢沟沙,當然了河劝,媽媽很都會做,大家喜歡什么矛紫,報菜名就可以了赎瞎,
媽媽可掌握了各種做法,來者不拒颊咬,厲害呢务甥!
我們看看具體的做法策略實現(xiàn):
//抽象策略類
interface CookStrategy {
public void cook();
}
//煎的策略做法
class FriedCookStrategy implements CookStrategy {
@Override
public void cook() {
System.out.println("煎的烹飪做法");
}
}
//蒸的策略做法
class SteamedCookStrategy implements CookStrategy {
@Override
public void cook() {
System.out.println("蒸的烹飪做法");
}
}
//環(huán)境使用類牡辽,廚師
class Shef {
private CookStrategy cookStrategy;
public CookStrategy getCookStrategy() {
return cookStrategy;
}
public void setCookStrategy(CookStrategy cookStrategy) {
this.cookStrategy = cookStrategy;
}
public void cook(){
cookStrategy.cook();
}
}
public class StrategyTest {
public static void main(String[] args) {
//廚師,我要開始做飯了
Shef shef = new Shef();
//小明說敞临,我喜歡吃油煎的态辛,香!
CookStrategy cookStrategy = new FriedCookStrategy();
shef.setCookStrategy(cookStrategy);
shef.cook();
//小紅說挺尿,我喜歡蒸的奏黑,健康也很美味!
cookStrategy = new SteamedCookStrategy();
shef.setCookStrategy(cookStrategy);
shef.cook();
}
}
//煎的烹飪做法
//蒸的烹飪做法