电商项目中设计模式的使用(其三 装饰者模式——嵌套的会员等级优惠价格计算
定义:动态的向一个现有的对象添加新的功能,同时又不改变其结构。它属于结构型模式。
优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
装饰者模式价格运算实现
实现思路
1、创建接口(MoneyOperation),定义订单价格计算,因为所有价格波动,都是基于订单价格来波动的。
2、创建订单价格计算类(OrderPayMoneyOperation),实现MoneyOperation接口,实现订单价格计算。
3、创建装饰者对象(Decorator),以供功能扩展。
4、实现优惠券优惠金额计算功能扩展,创建Decorator的扩展类CouponsMoneyOperation,先计算订单金额,再计算优惠
券使用之后的优惠金额。
5、实现金币抵现功能扩展,创建Decorator的扩展类GoldMoneyOperation,先计算订单金额,再实现金币优惠之后的金
额。
基础接口:创建接口 MoneySum ,该接口只用于定义计算订单金额的方法
public interface MoneySum {
//计算订单金额【结算金额、订单金额】
void sum(Order order);
}
订单金额计算类:创建类 OrderPayMoneyOperation 实现订单金额的计算。
@Component(value = "orderMoneySum")
public class OrderMoneySum implements MoneySum {
@Autowired
private ItemDao itemDao;
/***
* 订单金额计算、初始的结算金额计算
* @param order
*/
@Override
public void sum(Order order) {
//查询商品信息
Item item = itemDao.findById(order.getItemId());
//计算金额
order.setMoney(item.getPrice()*order.getNum());
order.setPaymoney(item.getPrice()*order.getNum());
}
}
装饰者类:创建装饰者类 DecoratorMoneySum 供其他类扩展
@Component
public abstract class DecoratorMoneySum implements MoneySum{
//把被装饰者对象作为一个属性注入进来
private MoneySum moneySum;
public void setMoneySum(MoneySum moneySum) {
this.moneySum = moneySum;
}
@Override
public void sum(Order order) {
//调用被装饰的对象的指定方法
moneySum.sum(order);
}
//价格计算
public abstract void money(Order order);
}
满100减10元价格计算:创建类 FullMoneySum 扩展装饰者类,实现满减价格计算。
@Component(value = "fullMoneySum")
public class FullMoneySum extends DecoratorMoneySum{
//原来的功能上进行增强
@Override
public void sum(Order order) {
//原有功能
super.sum(order);
//增强
moneySum(order);
}
//满100减5块
public void moneySum(Order order){
Integer paymoney = order.getPaymoney();
if(paymoney>=100){
order.setPaymoney(paymoney-10);
}
}
}
VIP优惠10元价格计算:创建类 VipMoneySum ,实现VIP优惠计算。
@Component(value = "vipMoneySum")
public class VipMoneySum extends DecoratorMoneySum {
//原有方法上增强
@Override
public void sum(Order order) {
//原有功能
super.sum(order);
//增强
vipMoneySum(order);
}
//Vip价格优惠-5
public void vipMoneySum(Order order){
order.setPaymoney(order.getPaymoney()-5);
}
}
@Service
public class OrderServiceImpl {
@Autowired
private MoneySum moneySum;
@Autowired
private DecoratorMoneySum full;
@Autowired
private DecoratorMoneySum vip;
@Autowired
private OrderDao orderDao;
public int add(Order order){
full.setMoneySum(moneySum);
vip.setMoneySum(full);
vip.sum(order);
int add = orderDao.add(order);
return add;
}
}