策略模式
常规写法
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设计模式