策略模式

维基百科:


策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式:

  • 定义了一族算法(业务规则);
  • 封装了每个算法;
  • 这族的算法可互换代替(interchangeable)。

定义统一策略接口

public interface CashSuper {
    double acceptCash(double money);
}

具体算法1

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

具体算法2

public class CashRebate implements CashSuper{

    private double moneyRebate = 1d;

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

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

具体算法3

public class CashReturn implements CashSuper{

    private double moneyCondition = 0.0d;
    private double moneyReturn  = 0.0d;

    public CashReturn(String moneyCondition, String moneyReturn) {       //满moneyCondition - 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.floor(money / moneyCondition) * moneyReturn;
        }
        return result;
    }
}

持有一个策略类引用,供客户端调用

public class CashContext {

    private CashSuper cashSuper;

    public double GetResult(double money) {
        return cashSuper.acceptCash(money);
    }

    public CashContext(String type) {
        switch (type) {
            case "正常收费" :
                cashSuper = new CashNormal();
                break;
            case "八折" :
                cashSuper = new CashRebate("0.8");
                break;
            case "满300减100" :
                cashSuper = new CashReturn("300", "100");
                break;
            default:
                cashSuper = new CashNormal();
                break;
        }
    }
}

客户端代码

public class Main {

    public static void main(String[] args) {
        CashContext cashContext = new CashContext("八折");
        double result = cashContext.GetResult(80);
        System.out.println(result);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值