一個策略接口,各個策略實現類,一個封裝類Context,一個場景類,一個原生的策略模式就須要這麼多.ide
可是這裏的封裝類Context類意義大嗎? 高層模塊仍是會接觸到具體的策略類 因此書上說,這種單獨的策略模式用的不多.能夠和工廠方法搭配使用this
書上介紹了一種枚舉類使用策略模式的方法挺好設計
public enum Caculator { ADD("+") { public int exec ( int a, int b){ return (a + b); } }, SUB("-"){ public int exec ( int a, int b){ return (a - b); } }; private String value; private Caculator(String _value){ this.value = _value; } public abstract int exec(int a, int b); }
這個類十分清晰code
工廠接口:接口
public interface Factory { public Strategy createStrategy(StrategyEnum strategyEnum); }
public class StrategyFactory implements Factory { @Override public Strategy createStrategy(StrategyEnum strategyEnum) { Strategy strategy = null; String clazzName = strategyEnum.getStrategyName(); try { Class<?> clazz = Class.forName(clazzName); strategy = (Strategy) clazz.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return strategy; } }
此時,咱們能夠在場景類get
Factory factory = new StrategyFactory(); Strategy strategy = factory.createStrategy(StrategyEnum.ADD); int result = strategy.exec(3 , 5); System.out.println(result);
便可實現咱們的功能,可是這裏又有一個問題了,每次執行,須要分爲四步,獲得工廠,獲取策略,封裝策略,執行方法.順序不能混亂.咱們必須得記住這四步.下面就能夠用到門面模式io
門面模式用於屏蔽子系統內的複雜性,給外界一個固定的訪問途徑 有幾個注意點:class
如今,咱們但願用了這個門面模式達到一種效果,在場景類裏,權限
CalculatorFacade facade = new CalculatorFacade(); int result1 = facade.exec(5, 6, StrategyEnum.SUB); System.out.print(result1);
這樣咱們高層模塊就不須要接觸具體的策略類方法
public class CalculatorFacade { private FacadeContext context = new FacadeContext(); CalculatorFacade(){} public int exec(int a, int b, StrategyEnum strategyEnum){ return this.context.calculate(a, b, strategyEnum); } }
上面的CalculatorFacde 就是具體的門面類, 能夠讓高層再也不依賴具體的子系統,看裏面也沒有涉及到業務邏輯,而是交給FacadeContext 處理.
public class FacadeContext { private Factory factory = new StrategyFactory(); private StrategyContext context = new StrategyContext(null); public FacadeContext(){ } public int calculate(int a, int b, StrategyEnum strategy){ this.context.setStrategy(this.factory.createStrategy(strategy)); return this.context.exec(a, b); } }
在這裏面,經過工廠生產具體的策略類,交給策略類的封裝類.讓他去執行