设计模式从零开始——策略模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qixinbruce/article/details/78149344

策略模式和简单工厂模式从代码结构上长得很像,但是经过了我百度了大量的资料已经对两种模式的代码进行对比,

最后总结出:

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折写两个不同的功能实现类,

将最本质的功能整体抽象出来,使代码修改起来更加灵活


猜你喜欢

转载自blog.csdn.net/qixinbruce/article/details/78149344
今日推荐