1. 程式人生 > >2.設計模式-----策略模式

2.設計模式-----策略模式

策略模式(Strategy)

定義:(它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會直接影響到用演算法的客戶。)

模式分析:

    策略模式是一種定義一系列演算法的模式,完成的工作相同,只是由於實現不同,所以以相同的方式呼叫,減少了各種演算法類與使用演算法類之間的耦合。

    策略模式可以封裝任何型別的規則,實踐過程中,只要在分析過程中聽到以不同的時間運用不同的業務規則,就可以考慮用策略模式。

簡單來說:方法通過引數的不同,呼叫了各不相同的演算法邏輯,得到了自己想要的結果。

結構圖:

     這個類圖並不複雜,右邊是策略介面以及它的實現類,左邊會有一個上下文,這個上下文會擁有一個策略,而具體這個策略是哪一種,我們是可以隨意替換的。

下面還是以一個計算器的程式碼為案例:

//抽象計算類
public interface OperationStategy {

    BigDecimal operation(BigDecimal num1,BigDecimal num2);
}
//實現OperationStategy,加法實現類
public class OperationStategyAdd implements OperationStategy {
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) {
        return num1.add(num2);
    }
}
//減法實現類
public class OperationStategySub implements OperationStategy {
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) {
        return num1.subtract(num2);
    }
}
public class Context {
    private OperationStategy operationStategy;

//   基本策略模式
//    public Context(OperationStategy operationStategy){
//        this.operationStategy = operationStategy;
//    }

    //   策略模式與簡單工廠模式結合
    public Context(OperationEnum operationEnum){
        switch (operationEnum){
            case ADD:
                operationStategy = new OperationStategyAdd();
            case SUB:
                operationStategy = new OperationStategySub();
        }
    }

    public BigDecimal operation(BigDecimal num1,BigDecimal num2){
        return operationStategy.operation(num1,num2);
    }
}
/**
 * @Author: yhr
 * @Date: 2018/7/27/027 10:23
 * 實現簡單計算器
 * 策略模式()
 * 應用場景:不同時間應用不同的業務規則
 */
public class RunMain {

    public static void main(String[] args) {
        //基本策略模式
        //Context context = new Context(new OperationStategyAdd());

        //策略模式與工廠模式結合
        Context context = new Context(OperationEnum.ADD);
        BigDecimal result = context.operation(new BigDecimal(3), new BigDecimal(2));
        System.out.println(result);
    }
}