首页 > 代码库 > 装饰者模式的应用示例

装饰者模式的应用示例

装饰者模式的作用

      装饰者模式可以复用系统中的各个单一功能组件,在运行时,可以将这些组件进行叠加,构造一个‘超级对象’,使得具有这些组件的功能。


     

        

装饰者模式的应用

 

    举个用户下单的业务场景。

 

    原有业务:用户下单,系统涉及到调用第三方接口,即下单接口。因此,当用户下单时,系统只需调用第三方接口来我完成下单操作即可。

    目前系统中有:1)下单接口OrderService;

                        2)下单接口的具体实现OrderServiceImpl,这个实现类主要是处理调用第三方接口来完成下单操作;

                      

  

    新增业务:系统中为了能够对用户下的订单进行统计分析,需要将用户下的单在本地备份一份。因此,系统在处理用户下单时,需要进行两步:①调用第三方下单接口使得下单成功;②下单成功后,将订单信息保存到本地数据库中。

 

   为了实现这个新增业务,可以使用装饰者模式。

   基于系统中有的接口及类,为了满足新增业务需求,需要增加:

         1)实体类Order,为添加到数据库的订单实体

         2)dao层saveOrder

    

   类图:

       


  代码:

   1)OrderServiceImpl:调用第三方处理用户下单操作

    

public class OrderServiceImpl implements OrderService {

    public boolean addOrder(Order order) {
        System.out.println("调用第三方接口正在下单...");
        
        System.out.println("下单者:"+order.getBuyer());
        
        return true;
    }

}

 

  2)OrderServiceDecorator:装饰者

 

public abstract class OrderServiceDecorator implements OrderService{

    OrderService orderService;
    
    public OrderServiceDecorator(OrderService orderService){
        this.orderService = orderService;
    }
}

 

 3)SaveOrderToDB:具体装饰者,当用户下单成功后,将订单保存到本地db

 

public class SaveOrderToDB extends OrderServiceDecorator {
    
    public SaveOrderToDB(OrderService orderService) {
        super(orderService);
    }

    public boolean addOrder(Order order) {
        orderService.addOrder(order);
        System.out.println("将订单保存到本地db中...");
        return true;
    }
}

 测试类:

public class OrderDecoratorTest {

    public static void main(String[] args) {
        Order order = new Order();
        order.setBuyer("wmmang");
        OrderService os = new SaveOrderToDB(new OrderServiceImpl());
        os.addOrder(order);
    }
}

 打印结果: