政策模式(Strategy Pattern):
定義一組算法,将每個算法都封裝起來,并且使他們之間可以互換。
對于政策模式來說了解清楚它三個角色的作用,基本就差不多了。
政策模式的三個角色:
- Context封裝角色
它也叫做上下文角色,起承上啟下封裝作用,屏蔽高層子產品對政策、算法的直接通路,封裝可能存在的變化。
- Strategy抽象角色
政策、算法家族的抽象,通常為接口,定義每個政策或算法必須具有的方法和屬性。
- ConcreteStrategy具體政策角色
實作抽象政策中的操作,含有具體的算法,即具體的政策實作。
下面是代碼實作
package com.jd.current.strategy;
/**
* 抽象的政策角色
* @author zhengxun
* @version 2017-05-06
*/
public interface Strategy {
public void doSomething();
}
package com.jd.current.strategy;
/**
* 抽象的政策角色
* @author zhengxun
* @version 2017-05-06
*/
public interface Strategy {
public void doSomething();
}
package com.jd.current.strategy;
/**
* 具體的政策1
* @author zhengxun
* @version 2017-05-06
*/
public class ConcreteStrategy1 implements Strategy{
public void doSomething() {
System.out.println("政策1");
}
}
package com.jd.current.strategy;
/**
* 具體的政策2
* @author zhengxun
* @version 2017-05-06
*/
public class ConcreteStrategy2 implements Strategy{
public void doSomething() {
System.out.println("政策2");
}
}
package com.jd.current.strategy;
/**
* 封裝角色
* @author zhengxun
* @version 2017-05-06
*/
public class Context {
private Strategy strategy = null;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void doSometing(){
this.strategy.doSomething();
}
}
政策模式的優點
- 算法可以自由切換
隻要實作抽象政策,就可以通過Context對其進行調用
- 避免使用多重條件判斷
- 擴充性良好
添加一個政策僅僅實作接口就可以了
政策模式的缺點
- 政策類數量增多
- 所有的政策類都需要對外暴露
政策模式的使用場景
- 多個類隻有在算法和行為上稍有不同的場景。
例如某些if 條件判斷 switch 判斷,如果判斷條件内執行代碼過多就可以拿到政策模式來做
- 算法需要自由切換的場景。
這個比較好了解,指的是具體用那種政策是根據入參來決定的
- 需要屏蔽算法規則的場景。