设计模式之策略模式

策略模式

常规写法

package com.wb.magic.test.designPattern.principle.strategy;

import java.math.BigDecimal;

/**
 */
public interface ICouponDiscount<T> {

    BigDecimal discountAmount(T couponInfo, BigDecimal skuPrice);

}

package com.wb.magic.test.designPattern.principle.strategy.imp;
import com.wb.magic.test.designPattern.principle.strategy.ICouponDiscount;

import java.math.BigDecimal;
import java.util.Map;

/**
 */
public class MJCouponDiscount implements ICouponDiscount<Map<String,String>> {

    /**
     * 满减计算
     * 1. 判断满足x元后-n元,否则不减
     * 2. 最低支付金额1元
     */
    @Override
    public BigDecimal discountAmount(Map<String, String> couponInfo, BigDecimal skuPrice) {
        String x = couponInfo.get("x");
        String o = couponInfo.get("n");

        // 小于商品金额条件的,直接返回商品原价
        if (skuPrice.compareTo(new BigDecimal(x)) < 0) return skuPrice;
        // 减去优惠金额判断
        BigDecimal discountAmount = skuPrice.subtract(new BigDecimal(o));
        if (discountAmount.compareTo(BigDecimal.ZERO) < 1) return BigDecimal.ONE;

        return discountAmount;
    }

}

package com.wb.magic.test.designPattern.principle.strategy;

import java.math.BigDecimal;

/**
 * Context 环境类封装角色,优点:扩展性强,算法中策略自由切换;缺点是环境类可能只需要一个某个策略类,但是这里面需要知道所有策略,对外暴露
 * 与迪米特原则违背:只是暴露应该暴露类或方法
 */
public class Context<T> {

    private ICouponDiscount<T> couponDiscount;

    public Context(ICouponDiscount<T> couponDiscount) {
        this.couponDiscount = couponDiscount;
    }

    public BigDecimal discountAmount(T couponInfo, BigDecimal skuPrice) {
        return couponDiscount.discountAmount(couponInfo, skuPrice);
    }

}

策略枚举类

package com.wb.magic.test.designPattern.principle.strategy;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 策略枚举类,实现抽象方法完成逻辑
 */
public enum ICouponEnum {
    NYGCouponDiscount{
        public BigDecimal discountAmount(Map<String,String> map, BigDecimal bigDecimal){
            String x = map.get("x");
            String o = map.get("n");

            // 小于商品金额条件的,直接返回商品原价
            if (bigDecimal.compareTo(new BigDecimal(x)) < 0) return bigDecimal;
            // 减去优惠金额判断
            BigDecimal discountAmount = bigDecimal.subtract(new BigDecimal(o));
            if (discountAmount.compareTo(BigDecimal.ZERO) < 1) return BigDecimal.ONE;

            return discountAmount;
        }
    };

    public abstract BigDecimal discountAmount(Map<String,String> map, BigDecimal bigDecimal);
}

//测试
  Context<Map<String, String>> mapContext = new Context<Map<String, String>>(new MJCouponDiscount());
        Map<String, String> map = new HashMap<>();
        map.put("x","18");
        map.put("n","12");
        System.out.println(mapContext.discountAmount(map, new BigDecimal(18)));

        System.out.println(ICouponEnum.NYGCouponDiscount.discountAmount(map, new BigDecimal("8")));

借鉴于重学java设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值