装饰者模式的作用
装饰者模式可以复用系统中的各个单一功能组件,在运行时,可以将这些组件进行叠加,构造一个‘超级对象’,使得具有这些组件的功能。
装饰者模式的应用
举个用户下单的业务场景。
原有业务:用户下单,系统涉及到调用第三方接口,即下单接口。因此,当用户下单时,系统只需调用第三方接口来我完成下单操作即可。
目前系统中有: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);
}
}
打印结果:
装饰者模式的应用示例