设计模式学习-策略模式

商场促销打折场景下,使用策略模式实现计算最终支付金额

收费基类:

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 收费基类
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:05
 */
public interface CashSuper {
    public BigDecimal acceptCash(BigDecimal money);
}

正常收费类继承收费基类:

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 正常收费类
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:06
 */
public class CashNormal implements CashSuper {
    @Override
    public BigDecimal acceptCash(BigDecimal money) {
        return money;
    }


}

折扣收费类实现收费基类

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 打折收费类
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:07
 */
public class CashDiscount implements CashSuper {
    private BigDecimal discountRate = new BigDecimal(1);


    /**
     * 折扣率,如打八折,就输入0.8
     * @param discountRate
     */
    public  CashDiscount(BigDecimal discountRate){
        this.discountRate = discountRate;
    }

    @Override
    public BigDecimal acceptCash(BigDecimal money) {
        return money.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP);
    }
}

返现收费类实现收费基类:

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 返现收费类
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:08
 */
public class CashReturn implements  CashSuper{
    private BigDecimal moneyCondition  = BigDecimal.ZERO;
    private BigDecimal moneyReturn = BigDecimal.ZERO;

    /**
     * 返利条件,如满300返100则moneyCondition为300,moneyReturn为100
     * @param moneyCondition
     * @param moneyReturn
     */
    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = new BigDecimal(moneyCondition);
        this.moneyReturn = new BigDecimal(moneyReturn);
    }

    @Override
    public BigDecimal acceptCash(BigDecimal money) {
        //如果消费金额大于返利条件,
        if(money.compareTo(moneyCondition)>=0){
            money = money.subtract(moneyReturn);
        }
        return money;
    }
}

收费上下文对象:

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 收费上下文对象 -- 策略模式
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:29
 */
public class CashContext {
    private CashSuper cashSuper;

    /**
     * 简单工厂模式创建对象
     * @param type
     */
    public  CashContext(String type) {
        switch (type){
            case CashConstants.NORMAL:
                cashSuper = new CashNormal();
                break;
            case CashConstants.DISCOUNT:
                cashSuper = new CashDiscount(new BigDecimal(0.8));
                break;
            case CashConstants.RETURN:
                cashSuper = new CashReturn(300,100);
                break;
        }

    }

    public BigDecimal getResult(double money){
        return cashSuper.acceptCash(new BigDecimal(money));
    }


    public enum CashEnum {
        NORMAL("正常收费","1"),
        DISCOUNT("打折收费","2"),
        RETURN("返现收费","3");

        CashEnum(String key,String value) {
            this.key = key;
            this.value = value;
        }


        public  String key;
        public  String value;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

    }
}

收费类型常量类;

package com.zawl.designpattern.strategy;

/**
 * @Description 收费类型常量类
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:57
 */
public class CashConstants {
    /**正常收费*/
    public  static final String NORMAL = "NORMAL";
    /**打折收费*/
    public  static final String DISCOUNT = "DISCOUNT";
    /**返现收费*/
    public  static final String RETURN = "RETURN";
}

客户端调用:

package com.zawl.designpattern.strategy;

import java.math.BigDecimal;

/**
 * @Description 客户端
 * @Author xiayunan <luomuqintian@163.com>
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/11/16 7:09
 */
public class Client {
    public static void main(String[] args) {
        CashContext context = new CashContext(CashConstants.RETURN);
        BigDecimal result = context.getResult(300);
        System.out.println("最终收费:"+result.toString());

        context = new CashContext(CashConstants.NORMAL);
        result = context.getResult(300);
        System.out.println("最终收费:"+result.toString());

        context = new CashContext(CashConstants.DISCOUNT);
        result = context.getResult(300);
        System.out.println("最终收费:"+result.toString());

    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值