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

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

最后总结出:

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值