装饰者模式是一种结构型设计模式,它可以在不改变对象的原有结构的情况下,动态地给对象添加新的功能和职责。装饰者模式的核心思想是使用组合和委托的方式,让装饰者类持有一个被装饰对象的引用,并在调用被装饰对象的方法之前或之后添加新的行为。这样,装饰者类可以在运行时动态地修改被装饰对象的行为,而不需要创建大量的子类。
代码示例:
// 定义抽象组件类,它是一个接口,定义了被装饰对象和装饰对象共同实现的方法interface Component { void operation();}// 定义具体组件类,它是一个实现了抽象组件接口的具体对象class ConcreteComponent implements Component { public void operation() { System.out.println("具体组件的操作"); }}// 定义装饰者抽象类,它继承了抽象组件类,并持有一个抽象组件的引用abstract class Decorator implements Component { protected Component component; // 通过构造函数传入被装饰对象 public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); // 可以在调用被装饰对象的方法之前或之后添加新的行为 }}// 定义具体装饰者类,它继承了装饰者抽象类,并在其中添加新的行为或功能class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); // 调用父类的方法 addedBehavior(); // 调用自己的方法 } public void addedBehavior() { System.out.println("具体装饰者A的操作"); }}// 定义具体装饰者类,它继承了装饰者抽象类,并在其中添加新的行为或功能class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); // 调用父类的方法 addedBehavior(); // 调用自己的方法 } public void addedBehavior() { System.out.println("具体装饰者B的操作"); }}// 测试代码public class DecoratorPatternDemo { public static void main(String[] args) { Component component = new ConcreteComponent(); // 创建被装饰对象 Component decoratorA = new ConcreteDecoratorA(component); // 创建具体装饰者A,并传入被装饰对象 Component decoratorB = new ConcreteDecoratorB(decoratorA); // 创建具体装饰者B,并传入具体装饰者A decoratorB.operation(); // 调用具体装饰者B的方法,输出如下: // 具体组件的操作 // 具体装饰者A的操作 // 具体装饰者B的操作 }}
代码示例:
假设有一个目标类叫做HelloService,它有一个final方法叫做sayHello:
// 定义一个目标类,其中有一个final方法class Target { public final void finalMethod() { System.out.println("目标类的final方法"); }}// 定义一个装饰者抽象类,它持有一个目标对象的引用abstract class Decorator { protected Target target; // 通过构造函数传入目标对象 public Decorator(Target target) { this.target = target; } public abstract void operation(); // 定义一个抽象方法,用于增强目标对象}// 定义一个具体装饰者类,它继承了装饰者抽象类,并在其中添加新的行为或功能class ConcreteDecorator extends Decorator { public ConcreteDecorator(Target target) { super(target); } public void operation() { before(); // 调用自己的方法 target.finalMethod(); // 调用目标对象的final方法 after(); // 调用自己的方法 } public void before() { System.out.println("调用final方法之前"); } public void after() { System.out.println("调用final方法之后"); }}// 测试代码public class DecoratorPatternDemo { public static void main(String[] args) { Target target = new Target(); // 创建目标对象 Decorator decorator = new ConcreteDecorator(target); // 创建具体装饰者,并传入目标对象 decorator.operation(); // 调用具体装饰者的方法,输出如下: // 调用final方法之前 // 目标类的final方法 // 调用final方法之后 }}
这样做并不是真正意义上的动态代理,因为您需要显式地创建装饰者对象,并传入目标对象。而且,如果目标类有多个final方法,您可能需要为每个方法都创建一个装饰者类,这会增加代码的复杂度和冗余。
实际上可以使用Spring AOP实现final方法的代理
// 定义一个目标类,包含一个final方法public class Target { public final void sayHello() { System.out.println("你好,我是目标"); }}// 定义一个切面类,用来编写增强逻辑@Aspectpublic class AspectDemo { // 定义一个前置通知,用@Before注解指定切入点表达式,匹配目标类的final方法 @Before("execution(final void com.example.Target.sayHello())") public void beforeAdvice() { System.out.println("建议之前:这是最后的方法"); }}// 定义一个测试类,用来创建代理对象并调用目标方法public class TestDemo { public static void main(String[] args) { // 创建目标对象 Target target = new Target(); // 创建代理工厂 AspectJProxyFactory factory = new AspectJProxyFactory(target); // 添加切面类 factory.addAspect(AspectDemo.class); // 获取代理对象 Target proxy = factory.getProxy(); // 调用代理对象的final方法 proxy.sayHello(); }}/**建议之前:这是最后的方法你好,我是目标**/
本文链接:http://www.28at.com/showinfo-26-11904-0.html如何用装饰者模式代理final方法
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 面试官最爱问的问题:你了解Spring Cloud的这些组件吗?
下一篇: 不愧是腾讯天美,面的贼细!