大话设计模式-笔录2-策略模式

设计模式—策略模式

描述

学习笔录,不足之处大神多多指教。
策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。

代码

场景:商场收银体系(正常收费、折扣、满减)
1.父类

public 

interface CashSuper {

    /**
     * 获取金额
     *
     * @param cashContext
     * @return
     */
    double acceptCash(CashContext cashContext);

}

2.正常、折扣、满减

public class CashNormal implements CashSuper {

    @Override
    public double acceptCash(CashContext cashContext) {
        return cashContext.getMoney();
    }

}
public class CashRebate implements CashSuper {

    private double moneyRebate;

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

    @Override
    public double acceptCash(CashContext cashContext) {
        return cashContext.getMoney() * moneyRebate;
    }

}
public class CashReturn implements CashSuper {

    /**
     * 条件
     */
    private double moneyCondition;

    /**
     * 满减
     */
    private double moneyReturn;

    public CashReturn(String condition, String returnData) {
        this.moneyCondition = Double.parseDouble(condition);
        this.moneyReturn = Double.parseDouble(returnData);
    }

    @Override
    public double acceptCash(CashContext cashContext) {
        double result = cashContext.getMoney();
        if (result > moneyCondition) {
            result = result - Math.floor(cashContext.getMoney() / moneyCondition) * moneyReturn;
        }
        return result;
    }
}

3、上下文

@Data
public class CashContext {

    private CashSuper cashSuper;

    private double money;

    public CashContext(String money) {
        this.money = Double.parseDouble(money);
        cashSuper = new CashNormal();
    }

    public CashContext(String money, String moneyRebate) {
        this.money = Double.parseDouble(money);
        cashSuper = new CashRebate(moneyRebate);
    }

    public CashContext(String money, String condition, String returnData) {
        this.money = Double.parseDouble(money);
        cashSuper = new CashReturn(condition, returnData);
    }


    public double getResult() {
        return cashSuper.acceptCash(this);
    }


}

3、调用

public class StrategyOperate {

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

    private static void getResult() {
        CashContext cashContext;
        // 正常收费
        cashContext = new CashContext("300");
        System.out.println(cashContext.getResult());
        // 折扣
        cashContext = new CashContext("300", "0.8");
        System.out.println(cashContext.getResult());
        // 满减
        cashContext = new CashContext("300", "200", "10");
        System.out.println(cashContext.getResult());
    }

}

简单工厂和策略模式区别在哪里?

小心上面代码中的 Bug;我只知道这些代码是正确的,但没有试过。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值