1 模式介紹
我們?cè)趯懘a的時(shí)候經(jīng)常會(huì)遇到很多選擇抡笼,需要使用if-else或者switch-case來(lái)完成選擇锚贱,如果業(yè)務(wù)邏輯簡(jiǎn)單欢策,還是比較容易處理的吆寨,但是業(yè)務(wù)邏輯復(fù)雜,我們寫在一起就會(huì)使代碼變得臃腫踩寇,不易維護(hù)啄清,這就違反了六大基本原則中的開(kāi)放封閉原則和單一職責(zé)原則了。而策略模式就可以很好的解決這些問(wèn)題俺孙,
2 模式定義
策略模式定義了一系列的算法辣卒,并將每個(gè)算法封裝起來(lái),而且使它們之間可以替換睛榄。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化荣茫。
3 策略模式的UML類圖
策略模式-UML類圖
角色介紹:
- Context:上下文角色,用來(lái)操作策略的上下文场靴;
- Stragety: 抽象策略角色计露,對(duì)算法、策略的抽象憎乙;
- ConcreteStragety:具體的策略實(shí)現(xiàn)票罐。
4 模式使用示例
下面通過(guò)一個(gè)選擇交通工具的案例來(lái)實(shí)現(xiàn)策略模式
抽象策略類
/**
* Description: 抽象策略類
*/
public interface TakeStrategy {
void take();
}
首先定義一個(gè)接口,take乘坐方式的方法
具體策略的實(shí)現(xiàn)泞边,一個(gè)乘坐公交車该押,一個(gè)開(kāi)車
/**
* Description: 具體策略的實(shí)現(xiàn)
*/
public class BusStrategy implements TakeStrategy {
@Override
public void take() {
System.out.println("乘坐公交車");
}
}
/**
* Description: 具體策略的實(shí)現(xiàn)
*/
public class CarStrategy implements TakeStrategy{
@Override
public void take() {
System.out.println("自己開(kāi)車");
}
}
上下文角色 其中構(gòu)造方法包含了策略類,通過(guò)不同的具體策略阵谚,來(lái)調(diào)用不同的體策略的方法
/**
* Created by Monkey on 2020/5/24.
* Description: 上下文角色蚕礼, 通過(guò)不同的具體策略烟具,來(lái)調(diào)用不同的體策略的方法
*/
public class Context {
private TakeStrategy takeStrategy;
private Context(TakeStrategy takeStrategy) {
this.takeStrategy = takeStrategy;
}
private void take(){
takeStrategy.take();
}
}
客戶端
public static void main(String[] args) {
Context content;
content = new Context(new BusStrategy());
content.take();
content = new Context(new CarStrategy());
content.take();
}
在這里我們只需要傳一個(gè)具體的策略就可以了,不需要關(guān)心具體策略里面是怎么實(shí)現(xiàn)的奠蹬。結(jié)構(gòu)也很清晰朝聋,使用也簡(jiǎn)單。
5 總結(jié)
使用場(chǎng)景:
- 針對(duì)同一類型問(wèn)題的多種處理方式囤躁,僅僅是具體行為有差別時(shí)冀痕;
- 需要安全地封裝多種同一類型的操作時(shí);
- 出現(xiàn)同一抽象類有多個(gè)子類狸演,而又需要使用if-else或者switch-case來(lái)選擇具體子類言蛇。
優(yōu)點(diǎn):
- 結(jié)構(gòu)清晰,使用簡(jiǎn)單
- 可以避免使用多重條件語(yǔ)句宵距,易于維護(hù)腊尚;
- 易于擴(kuò)展,需要添加一個(gè)策略時(shí)满哪,只需要實(shí)現(xiàn)接口就可以看婿斥。
缺點(diǎn):
- 每一個(gè)策略都是一個(gè)類,復(fù)用性小哨鸭,策略過(guò)多時(shí)受扳,類也隨之增加。