天天看點

設計模式-政策模式最直接加減法引入政策模式使用枚舉總結應用

設計模式-政策模式

以電腦為栗

最直接加減法

public class Calculator{
    // 加符号
    private final static String ADD_SYMBOL = "+";
    // 減符号
    private final static String SUB_SYMBOL = "-";
    // 執行
    public int exec(int a, int b, String symbol){
        int result = 0;
        if(symbol.equals(ADD_SYMBOL)){    // 比較
            result = this.add(a,b);
        }else if(symbol.equals(SUB_SYMBOL)){
            result = this.sub(a,b);
        }
    }
    // 加法
    public int add(int a, int b){
        return a + b;
    }
    // 減法
    public int sub(int a, int b){
        return a - b;
    }
}           

書寫場景類

public class Client{
    public static void main(String[] args){
        // 擷取輸入
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        // 生成運算器
        Calculator calculator = new Calculator();
        calculator.exec(a,b);
    }
}           

引入政策模式

即,将原先的加減法進行拆分

protected interface Calculator{
    public int exec(int a, int b);
}           

書寫具體政策

public class Add implements Calculator{
    // 加法
    @Overrider
    public int exec(int a, int b){
        return a + b;    
    }
}           

書寫減法運算

public class Sub implements Calculator{
    // 減法
    public int exec(int a, int b){
        return a - b;
    }
}           

why?為什麼要進行封裝,因為保證可以随時的增加具體的政策,是以需要一個上下文。

public class Context{
    private Calculator cal = null;
    // 通過構造函數注入
    public Context(Calculator _cal){
        this.cal = _cal;    // 完成指向
    }
    // 執行
    public int exec(int a, int b){
        return this.cal.exec(a,b);
    }
}           

場景

public class Client{
    // 加
    public final static String ADD_SYMBOL = "+";
    // 減
    public final static String SUB_SYMBOL = "-";
    public static void main(String[] args){
        int a = Integer.parseInt(args[0]);
        String symbol = args[1];
        int b = Integer.parseInt(args[2]);
        // 初始化上下文
        Context context = null;
        // 選擇政策
        if(symbol.equals(ADD_SYMBOL)){
            context = new Context(new Add());
        }else if(symbol.equals(SUB_SYMBOL)){
            context = new COntext(new SUb());
        }
        // 結果
        context.exec(a,b);
    }
}           

使用枚舉

public enum Calculator{
    // 枚舉成員
    // 加法枚舉
    ADD("+"){
        public int exec(int a, int b){
            return a + b;
        }
    }
    // 減法枚舉
    SUB("-"){
        public int exec(int a, int b){
            return a - b;    
        }    
    }
    // 定義類型
    String value = "";
    // 構造
    private Calculator(String _value){
        this.value = _value;
    }
    // get
    public String getValue(){
        return this.value;
    }
    // 預留擴充
    public abstract int exec(int a. int b);
}           

最後書寫場景

public class Client{
    public static void main(String[] args){
        int a = Integer.parseInt(args[0]);
        String symbol = args[1];
        int b = Integer.parseInt(args[2]);
        Calculator.ADD.exec(a, b);
    }
}           

總結

将原先耦合的if進行拆分成類,然後使用的時候注入類即可。或者使用枚舉類型,如果需要增加,需要實作抽象方法。

應用

動畫的實作,将各種緩動函數,書寫為政策模式,然後使用的時候,将類注入即可。

表單校驗,同樣可以将各種校驗進行解耦,使用的時候注入即可。

繼續閱讀