电商项目中设计模式的使用(其三 装饰者模式——嵌套的会员等级优惠价格计算

电商项目中设计模式的使用(其三 装饰者模式——嵌套的会员等级优惠价格计算

定义:动态的向一个现有的对象添加新的功能,同时又不改变其结构。它属于结构型模式。

优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

装饰者模式价格运算实现

实现思路
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值