提示
装饰器模式示例。@ermo
# 装饰器模式
装饰器模式主要有这么几部分组成
名称 | 描述 |
---|---|
抽象组件类 | 被装饰的对象,只定义行为,具体的实现应该由子类完成 |
抽象实现 | 被装饰对象的具体实现,实现抽象组件类的抽象方法 |
抽象装饰类 | 抽象组件类的子类,内部维护抽象组件类的引用,并实现抽象组件类的抽象方法,具体增强行为应该由其子类实现 |
抽象装饰类实现 | 抽象装饰类的子类,用于增强抽象组件类的行为 |
来举一个简单例子,现在有一个订单审核功能,包括礼品订单和销售订单。
对于礼品订单不涉及金额,因此我们只需要在审核后给用户发送一条短信;
对于销售订单涉及金额,因此我们希望在订单审核前进行检查,并且在订单审核后要记录操作人信息理。
这个例子可以有很多种方法实现,本次只用装饰器来进行演示。
首先创建一个抽象组件类,并拥有审核订单的抽象方法。
public abstract class AbstractOrderAudit {
/**
* 订单审核
*
* @param orderNo 订单编号
*/
abstract void audit(String orderNo);
}
创建订单审核类的具体实现,该类实现了基本的审核功能。
public class OrderAuditImpl extends AbstractOrderAudit {
@Override
void audit(String orderNo) {
System.out.println("订单审核成功:" + orderNo);
}
}
创建抽象装饰类,实现订单审核抽象类,内部维护订单审核对象的引用,并且实现审核功能,供子类增强。
public class OrderAuditDecorator extends AbstractOrderAudit {
private AbstractOrderAudit abstractOrderAudit;
public OrderAuditDecorator(AbstractOrderAudit abstractOrderAudit) {
this.abstractOrderAudit = abstractOrderAudit;
}
@Override
void audit(String orderNo) {
abstractOrderAudit.audit(orderNo);
}
}
创建礼品订单装饰实现类,继承订单审核装饰类,对订单审核功能进行增强。
public class GiftOrderAudit extends OrderAuditDecorator {
public GiftOrderAudit(AbstractOrderAudit abstractOrderAudit) {
super(abstractOrderAudit);
}
@Override
void audit(String orderNo) {
super.audit(orderNo);
// 审核后发送短信通知用户
System.out.println("礼品订单,发送短信成功:" + orderNo);
}
}
创建销售订单装饰实现类,继承订单审核装饰类,对订单审核功能进行增强。
public class SaleOrderAudit extends OrderAuditDecorator {
public SaleOrderAudit(AbstractOrderAudit abstractOrderAudit) {
super(abstractOrderAudit);
}
@Override
void audit(String orderNo) {
// 审核前进行订单校验
System.out.println("销售订单校验成功:" + orderNo);
super.audit(orderNo);
// 审核后保存用户操作记录
System.out.println("销售订单保存审核成功,保存用户操作记录:" + orderNo);
}
}
编写测试代码。
public static void main(String[] args) {
// 基础订单审核
AbstractOrderAudit orderAudit = new OrderAuditImpl();
orderAudit.audit("123");
System.out.println("--------------------华丽丽的分割线-----------------------");
// 礼品订单的审核
GiftOrderAudit giftOrderAudit = new GiftOrderAudit(orderAudit);
giftOrderAudit.audit("456");
System.out.println("--------------------华丽丽的分割线-----------------------");
// 销售订单的审核
SaleOrderAudit saleOrderAudit = new SaleOrderAudit(orderAudit);
saleOrderAudit.audit("789");
}
输出:
订单审核成功:123
--------------------华丽丽的分割线-----------------------
订单审核成功:456
礼品订单,发送短信成功:456
--------------------华丽丽的分割线-----------------------
销售订单校验成功:789
订单审核成功:789
销售订单保存审核成功,保存用户操作记录:789
可以看到三种类型的订单审核进行不同的输出内容,开发过程中,如果不想对历史代码进行侵入式的开发,使用装饰器模式可以很大程度的解耦合,并且可以进行各种个性化的增强。