面试题答案
一键面试适合使用装饰器模式的实际场景
- 日志记录功能:在已有业务逻辑的基础上,动态添加日志记录功能,而不改变原有业务类的代码。例如,一个订单处理系统,在处理订单的核心逻辑不变的情况下,为每次订单处理操作添加日志记录,记录订单处理的时间、操作人等信息。
- 图形绘制增强:在图形绘制库中,对于基本图形(如圆形、矩形),可以动态添加装饰,比如添加边框颜色、填充颜色等属性。例如,原本绘制一个简单矩形,现在可以根据需求动态给矩形添加红色边框、黄色填充等装饰。
- 用户权限控制:在一个系统的不同功能模块上,动态添加权限控制。比如,一个文件管理模块,原本只有基本的文件操作功能,现在对于不同权限的用户,动态添加是否可删除、是否可修改等权限限制。
使用装饰器模式解决问题的方式
- 定义组件接口:首先定义一个通用的组件接口,它包含了核心业务方法。例如,对于订单处理系统,定义一个
OrderProcessor
接口,包含processOrder()
方法。
public interface OrderProcessor {
void processOrder();
}
- 实现具体组件类:实现上述接口的具体组件类,完成核心业务逻辑。比如
DefaultOrderProcessor
类。
public class DefaultOrderProcessor implements OrderProcessor {
@Override
public void processOrder() {
System.out.println("Processing order...");
}
}
- 定义装饰器抽象类:该抽象类实现组件接口,并持有一个组件接口的引用,用于委托调用。
public abstract class OrderProcessorDecorator implements OrderProcessor {
protected OrderProcessor orderProcessor;
public OrderProcessorDecorator(OrderProcessor orderProcessor) {
this.orderProcessor = orderProcessor;
}
@Override
public void processOrder() {
orderProcessor.processOrder();
}
}
- 实现具体装饰器类:继承装饰器抽象类,在委托调用的基础上添加额外的功能。例如,添加日志记录的装饰器
LoggingOrderProcessorDecorator
。
public class LoggingOrderProcessorDecorator extends OrderProcessorDecorator {
public LoggingOrderProcessorDecorator(OrderProcessor orderProcessor) {
super(orderProcessor);
}
@Override
public void processOrder() {
System.out.println("Logging before order processing...");
orderProcessor.processOrder();
System.out.println("Logging after order processing...");
}
}
- 使用装饰器:在客户端代码中,通过组合的方式动态添加装饰。
public class Main {
public static void main(String[] args) {
OrderProcessor orderProcessor = new DefaultOrderProcessor();
orderProcessor = new LoggingOrderProcessorDecorator(orderProcessor);
orderProcessor.processOrder();
}
}
通过以上步骤,就可以在不修改原有核心业务类代码的情况下,灵活地为其添加新的功能,实现了功能的动态扩展,符合开闭原则。