策略模式(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 判斷,如果判斷條件內執行代碼過多就可以拿到策略模式來做
- 算法需要自由切換的場景。
這個比較好理解,指的是具體用那種策略是根據入參來決定的
- 需要屏蔽算法規則的場景。