首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
CGLIB AopProxy实现 - CglibAopProxy
AopProxyFactory配置管理器 - AdvisedSupport
Advisor链工厂接口与实现 - AdvisorChainFactory
目标对象来源接口与实现 - TargetSource
代理对象创建基础类 - ProxyCreatorSupport
AdvisedSupport事件监听器 - AdvisedSupportListener
ProxyCreatorSupport标准实现 - ProxyFactory
ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
IoC容器自动代理抽象 - AbstractAutoProxyCreator
IoC容器自动代理标准实现
IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
AOP Infrastructure Bean接口 - AopInfrastructureBean
AOP上下文辅助类 - AopContext
代理工厂工具类 - AopProxyUtils
AOP工具类 - AopUtils
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
AspectJ XML配置驱动实现 -
AOP配置Schema-based 实现 -
Aspect Schema-based实现 -
Pointcut Schema-based实现 -
Around Advice Schema-based实现 -
Before Advice Schema-based实现 -
After Advice Schema-based实现 -
After Returning Advice Schema-based实现 -
After Throwing Advice Schema-based实现 -
Adviser Schema-based实现 -
Introduction Schema-based实现 -
作用域代理Schema-based实现 -
抽象工厂模式(Abstract factory)实现
构建器模式(Builder)实现
工厂方法模式(Factory method)实现
原型模式(Prototype)实现
单例模式(Singleton)实现
适配器模式(Adapter)实现
组合模式(Composite)实现
装饰器模式(Decorator)实现
享元模式(Flyweight)实现
代理模式(Proxy)实现
模板方法模式(Template Method)实现
责任链模式(Chain of Responsibility)实现
观察者模式(Observer)实现
策略模式(Strategy)实现
命令模式(Command)实现
状态模式(State)实现
Spring AOP在 Spring 事件(Events)
Spring AOP在Spring 事务(Transactions)理论基础
Spring AOP在Spring 事务(Transactions)源码分析
Spring AOP在Spring 缓存(Caching)
Spring AOP在Spring本地调度(Scheduling)
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(下)
小册名称:Spring AOP 编程思想(下)
### 装饰器模式(Decorator)实现 在深入探讨Spring AOP(面向切面编程)的高级应用时,理解并应用设计模式,尤其是装饰器模式(Decorator Pattern),对于构建灵活、可扩展的系统架构至关重要。装饰器模式是一种结构型设计模式,它允许我们动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。在Spring AOP的上下文中,虽然AOP本身不是直接实现装饰器模式,但其核心概念——切面和通知(Advice),与装饰器模式有着深刻的联系,特别是在理解如何动态增强方法行为时。 #### 一、装饰器模式概述 装饰器模式的核心在于创建一个包装对象,即装饰器,来包裹真实对象。这个装饰器对象与真实对象实现同一个接口,以便在任何需要真实对象的地方都可以使用装饰器对象。装饰器可以在被装饰对象的方法调用前后添加新的行为,从而实现对原有功能的增强或修改,而无需修改原有类的代码。 **关键组件**: 1. **组件接口(Component)**:定义一个对象接口,可以给这些对象动态地添加一些职责。 2. **具体组件(Concrete Component)**:定义了一个具体的对象,也可以给这个对象添加一些职责。 3. **装饰角色(Decorator)**:持有一个组件(Component)对象的引用,并定义一个与组件接口一致的接口。 4. **具体装饰角色(Concrete Decorator)**:负责给组件添加新的职责。 #### 二、装饰器模式在Java中的实现 为了更好地理解装饰器模式,我们通过一个简单的例子来展示如何在Java中实现它。假设我们有一个咖啡(Coffee)系统,不同的咖啡有不同的口味和配料,我们可以使用装饰器模式来动态地添加这些特性。 **1. 定义组件接口** ```java public interface Coffee { double cost(); String getDescription(); } ``` **2. 定义具体组件** ```java public class SimpleCoffee implements Coffee { @Override public double cost() { return 1.5; } @Override public String getDescription() { return "Simple Coffee"; } } ``` **3. 定义装饰器角色** ```java public abstract class CoffeeDecorator implements Coffee { protected Coffee decoratedCoffee; public CoffeeDecorator(Coffee decoratedCoffee) { this.decoratedCoffee = decoratedCoffee; } @Override public double cost() { return decoratedCoffee.cost(); } @Override public String getDescription() { return decoratedCoffee.getDescription(); } } ``` **4. 定义具体装饰角色** ```java public class Milk extends CoffeeDecorator { public Milk(Coffee decoratedCoffee) { super(decoratedCoffee); } @Override public double cost() { return super.cost() + 0.5; } @Override public String getDescription() { return super.getDescription() + ", Milk"; } } public class WhippedCream extends CoffeeDecorator { public WhippedCream(Coffee decoratedCoffee) { super(decoratedCoffee); } @Override public double cost() { return super.cost() + 1.0; } @Override public String getDescription() { return super.getDescription() + ", Whipped Cream"; } } ``` **5. 使用装饰器** ```java public class CoffeeShop { public static void main(String[] args) { Coffee coffee = new SimpleCoffee(); coffee = new Milk(coffee); coffee = new WhippedCream(coffee); System.out.println(coffee.getDescription() + " $" + coffee.cost()); } } ``` 输出将是:`Simple Coffee, Milk, Whipped Cream $3.0` #### 三、装饰器模式与Spring AOP的联系 虽然Spring AOP不直接实现装饰器模式,但其核心概念——切面和通知,在功能上实现了类似的效果。在Spring AOP中,我们通过定义切面(Aspect)和通知(Advice)来增强方法的行为,这与装饰器模式在对象上动态添加职责的思想不谋而合。 - **切面(Aspect)**:类似于装饰器模式中的装饰器角色,它定义了横切关注点(cross-cutting concerns),如日志、事务管理等,这些关注点可以跨多个类和方法。 - **通知(Advice)**:类似于具体装饰角色,它定义了切面的具体行为,如前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)等,这些通知在目标方法执行的不同阶段被织入(weave)到目标方法中。 Spring AOP通过代理(Proxy)机制实现了这些功能,无论是使用JDK动态代理还是CGLIB代理,其本质都是创建了一个代理对象来包裹目标对象,并在代理对象上执行增强的逻辑,这与装饰器模式通过装饰器对象包裹真实对象并在其上添加额外职责的思想是一致的。 #### 四、装饰器模式的优势与局限 **优势**: 1. **灵活性**:可以动态地给对象添加新的职责,而无需修改原有类的代码。 2. **透明性**:对客户端而言,装饰前后的对象具有相同的接口,因此可以透明地使用装饰后的对象。 3. **扩展性**:通过组合不同的装饰器,可以创建出功能强大的对象。 **局限**: 1. **多层装饰**:过多的装饰可能会导致代码难以理解和维护。 2. **性能开销**:每次调用都会经过装饰器链,可能会引入额外的性能开销。 #### 五、结论 装饰器模式是一种强大的设计模式,它允许我们以灵活的方式动态地增强对象的功能。在Spring AOP的上下文中,虽然不直接实现装饰器模式,但其核心概念与装饰器模式有着深刻的联系。通过理解装饰器模式,我们可以更好地把握Spring AOP的工作原理,从而设计出更加灵活、可扩展的系统架构。在实际开发中,我们可以根据具体需求选择是否使用装饰器模式或Spring AOP来增强对象的功能。
上一篇:
组合模式(Composite)实现
下一篇:
享元模式(Flyweight)实现
该分类下的相关小册推荐:
Java语言基础9-常用API和常见算法
Java必知必会-Maven初级
Java高并发秒杀入门与实战
Java语言基础4-数组详解
Mybatis合辑2-Mybatis映射文件
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础16-JDK8 新特性
Java必知必会-Maven高级
SpringBoot合辑-初级篇
Java面试指南
Java语言基础15-单元测试和日志技术
深入拆解 Java 虚拟机