1. 程式人生 > >設計模式從零開始——策略模式

設計模式從零開始——策略模式

策略模式和簡單工廠模式從程式碼結構上長得很像,但是經過了我百度了大量的資料已經對兩種模式的程式碼進行對比,

最後總結出:

1、策略模式和簡單工廠模式都是總分的結構,即通過總的排程介面去判斷具體實現哪一種功能——相同點;

2、簡單工廠模式的每種實視想法是從功能實現角度出發,每一個實現類都是為了完成某一項功能,

     策略模式的每種實現本質是從演算法角度出發,每一個實現類是為了實現某一項邏輯功能——不同點


以下是以商場打折為背景,使用策略模式實現不同的打折方式的程式碼:


打折演算法的父類:

public abstract class CashSuper {
    public abstract double acceptCash(double money);
}


按原價收費演算法:

public class CashNormal extends CashSuper {
    @Override
    public double acceptCash(double money) {
        return money;
    }
}



折扣演算法:

public class CashRebate extends CashSuper {
    private double moneyRebate = 1d;

    public CashRebate(String moneyRebate) {
        this.moneyRebate = Double.parseDouble(moneyRebate);
    }

    @Override
    public double acceptCash(double money) {
        return money * moneyRebate;
    }
}

滿額返現演算法:

public class CashRerurn extends CashSuper {
    private double moneyCondition = 0.0d;
    private double moneyReturn = 0.0d;

    public CashRerurn(String moneyCondition, String moneyReturn) {
        this.moneyCondition = Double.parseDouble(moneyCondition);
        this.moneyReturn = Double.parseDouble(moneyReturn);
    }

    @Override
    public double acceptCash(double money) {
        double result = money;
        if (money >= moneyCondition) {
            result = money - Math.round(money / moneyCondition * moneyReturn);
        }
        return result;
    }
}

演算法工廠類:

public class CashContext {
    CashSuper cs = null;

    public CashContext(String type) {
        switch (type) {
            case "正常收費":
                CashNormal cs0 = new CashNormal();
                cs = cs0;
                break;
            case "滿300飯100":
                CashRerurn cr1 = new CashRerurn("300", "100");
                cs = cr1;
                break;
            case "打8折":
                CashRebate cr2 = new CashRebate("0.8");
                cs = cr2;
                break;
        }
    }

    public double getResult(double money) {
        return cs.acceptCash(money);
    }
}


客戶呼叫程式:

public class Sale {
    static double total = 0.0d;


    private static void btnOK_Click() {
        CashContext csuper = new CashContext("滿300飯100");
        double totalPrices = 0d;
        totalPrices = csuper.getResult(400);
        total = total + totalPrices;
        System.out.println("總價:" + total);

    }

    public static void main(String[] args) {
        btnOK_Click();
    }
}



以上程式碼通過和上一篇簡單工廠設計模式的例子相對比,可以發現簡單工廠的例子中,具體實現的加減乘除四種運算方式只是四種簡單的功能,

在簡單工廠模式中,具體的實現類也是隻考慮功能的實現

而策略模式中,結合著簡單工廠模式的總分結構,對應每個具體實現都變成了帶有邏輯的演算法,通過客戶端呼叫的時候,也是執行具體的邏輯功能,

而不是像加減乘除這樣簡單的功能實現

這樣實現的好處在於商場無論是打5折還是打9折,在程式中的體現就是改變客戶端呼叫打折演算法時傳遞的引數,不再需要對於5折,9折寫兩個不同的功能實現類,

將最本質的功能整體抽象出來,使程式碼修改起來更加靈活