策略模式 ,工廠模式,門面模式的混合使用

策略模式

一個策略接口,各個策略實現類,一個封裝類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

  1. 門面類裏不能涉及到具體的業務邏輯, 由於一旦你的門面類裏有具體的業務了,那會造成一個倒以來,子系統沒有了門面類就不能訪問
  2. 門面類是外面和子系統訪問的接口,因此設計時必定要仔細,他是不能輕易被改變的
  3. 門面類能夠不止一個,能夠按照功能劃分,權限劃分等等

如今,咱們但願用了這個門面模式達到一種效果,在場景類裏,權限

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);
    }

}

在這裏面,經過工廠生產具體的策略類,交給策略類的封裝類.讓他去執行

相關文章
相關標籤/搜索