首页 > 代码库 > 装饰者模式的应用示例
装饰者模式的应用示例
装饰者模式的作用
装饰者模式可以复用系统中的各个单一功能组件,在运行时,可以将这些组件进行叠加,构造一个‘超级对象’,使得具有这些组件的功能。
装饰者模式的应用
举个用户下单的业务场景。
原有业务:用户下单,系统涉及到调用第三方接口,即下单接口。因此,当用户下单时,系统只需调用第三方接口来我完成下单操作即可。
目前系统中有: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;
}
}
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;
}
}
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 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);
}
}
public static void main(String[] args) {
Order order = new Order();
order.setBuyer("wmmang");
OrderService os = new SaveOrderToDB(new OrderServiceImpl());
os.addOrder(order);
}
}
打印结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。