21, 重复代码处理的两种方式

利用工厂模式+模板方法模式,消除if…else和重复代码
**在抽象方法中定义好业务流程, 通用的直接实现, 不同用户的处理方式不同,就抽象出来让子类去实现**
public abstract class AbstractCart {
	//处理购物车的大量重复逻辑在父类实现
	public Cart process(long userId, Map<Long, Integer> items) {
	Cart cart = new Cart();
	List<Item> itemList = 商品list;
	
	cart.setItems(itemList);
	//让子类处理每一个商品的优惠
	itemList.stream().forEach(item -> {
		processCouponPrice(userId, item);
		processDeliveryPrice(userId, item);
	});
	
	//计算商品总价
	cart.setTotalItemPrice(cart.getItems().stream().map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))).reduce(BigDec
	//计算总运费
	cart.setTotalDeliveryPrice(cart.getItems().stream().map(Item::getDeliveryPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
	//计算总折扣
	cart.setTotalDiscount(cart.getItems().stream().map(Item::getCouponPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
	//计算应付价格
	cart.setPayPrice(cart.getTotalItemPrice().add(cart.getTotalDeliveryPrice()).subtract(cart.getTotalDiscount()));
	return cart;
} /
	
	/处理商品优惠的逻辑留给子类实现
	protected abstract void processCouponPrice(long userId, Item item);
	
	//处理配送费的逻辑留给子类实现
	protected abstract void processDeliveryPrice(long userId, Item item);
}

普通用户

@Service(value = "NormalUserCart")
public class NormalUserCart extends AbstractCart {
	@Override
		protected void processCouponPrice(long userId, Item item) {
		item.setCouponPrice(BigDecimal.ZERO);
	} 
	@Override
	protected void processDeliveryPrice(long userId, Item item) {
		item.setDeliveryPrice(item.getPrice()
		.multiply(BigDecimal.valueOf(item.getQuantity()))
		.multiply(new BigDecimal("0.1")));
	}
}

VIP用户

@Service(value = "VipUserCart")
public class VipUserCart extends NormalUserCart {
	@Override
	protected void processCouponPrice(long userId, Item item) {
		if (item.getQuantity() > 2) {
		item.setCouponPrice(item.getPrice()
		.multiply(BigDecimal.valueOf(100 - Db.getUserCouponPercent(userId)).divide(new BigDecimal("100")))
		.multiply(BigDecimal.valueOf(item.getQuantity() - 2)));
		} else {
			item.setCouponPrice(BigDecimal.ZERO);
		}
}

在这里插入图片描述

2,利用注解+反射消除重复代码
将重复的操作, 利用注解和反射处理, 类型的都通过这个方法来处理。 详细查看 Java开发错误100例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值