裝飾者模式是一種結(jié)構(gòu)型設(shè)計模式,它可以在不改變對象的原有結(jié)構(gòu)的情況下,動態(tài)地給對象添加新的功能和職責。裝飾者模式的核心思想是使用組合和委托的方式,讓裝飾者類持有一個被裝飾對象的引用,并在調(diào)用被裝飾對象的方法之前或之后添加新的行為。這樣,裝飾者類可以在運行時動態(tài)地修改被裝飾對象的行為,而不需要創(chuàng)建大量的子類。
代碼示例:
// 定義抽象組件類,它是一個接口,定義了被裝飾對象和裝飾對象共同實現(xiàn)的方法interface Component { void operation();}// 定義具體組件類,它是一個實現(xiàn)了抽象組件接口的具體對象class ConcreteComponent implements Component { public void operation() { System.out.println("具體組件的操作"); }}// 定義裝飾者抽象類,它繼承了抽象組件類,并持有一個抽象組件的引用abstract class Decorator implements Component { protected Component component; // 通過構(gòu)造函數(shù)傳入被裝飾對象 public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); // 可以在調(diào)用被裝飾對象的方法之前或之后添加新的行為 }}// 定義具體裝飾者類,它繼承了裝飾者抽象類,并在其中添加新的行為或功能class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); // 調(diào)用父類的方法 addedBehavior(); // 調(diào)用自己的方法 } public void addedBehavior() { System.out.println("具體裝飾者A的操作"); }}// 定義具體裝飾者類,它繼承了裝飾者抽象類,并在其中添加新的行為或功能class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); // 調(diào)用父類的方法 addedBehavior(); // 調(diào)用自己的方法 } public void addedBehavior() { System.out.println("具體裝飾者B的操作"); }}// 測試代碼public class DecoratorPatternDemo { public static void main(String[] args) { Component component = new ConcreteComponent(); // 創(chuàng)建被裝飾對象 Component decoratorA = new ConcreteDecoratorA(component); // 創(chuàng)建具體裝飾者A,并傳入被裝飾對象 Component decoratorB = new ConcreteDecoratorB(decoratorA); // 創(chuàng)建具體裝飾者B,并傳入具體裝飾者A decoratorB.operation(); // 調(diào)用具體裝飾者B的方法,輸出如下: // 具體組件的操作 // 具體裝飾者A的操作 // 具體裝飾者B的操作 }}
代碼示例:
假設(shè)有一個目標類叫做HelloService,它有一個final方法叫做sayHello:
// 定義一個目標類,其中有一個final方法class Target { public final void finalMethod() { System.out.println("目標類的final方法"); }}// 定義一個裝飾者抽象類,它持有一個目標對象的引用abstract class Decorator { protected Target target; // 通過構(gòu)造函數(shù)傳入目標對象 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(); // 調(diào)用自己的方法 target.finalMethod(); // 調(diào)用目標對象的final方法 after(); // 調(diào)用自己的方法 } public void before() { System.out.println("調(diào)用final方法之前"); } public void after() { System.out.println("調(diào)用final方法之后"); }}// 測試代碼public class DecoratorPatternDemo { public static void main(String[] args) { Target target = new Target(); // 創(chuàng)建目標對象 Decorator decorator = new ConcreteDecorator(target); // 創(chuàng)建具體裝飾者,并傳入目標對象 decorator.operation(); // 調(diào)用具體裝飾者的方法,輸出如下: // 調(diào)用final方法之前 // 目標類的final方法 // 調(diào)用final方法之后 }}
這樣做并不是真正意義上的動態(tài)代理,因為您需要顯式地創(chuàng)建裝飾者對象,并傳入目標對象。而且,如果目標類有多個final方法,您可能需要為每個方法都創(chuàng)建一個裝飾者類,這會增加代碼的復(fù)雜度和冗余。
實際上可以使用Spring AOP實現(xiàn)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("建議之前:這是最后的方法"); }}// 定義一個測試類,用來創(chuàng)建代理對象并調(diào)用目標方法public class TestDemo { public static void main(String[] args) { // 創(chuàng)建目標對象 Target target = new Target(); // 創(chuàng)建代理工廠 AspectJProxyFactory factory = new AspectJProxyFactory(target); // 添加切面類 factory.addAspect(AspectDemo.class); // 獲取代理對象 Target proxy = factory.getProxy(); // 調(diào)用代理對象的final方法 proxy.sayHello(); }}/**建議之前:這是最后的方法你好,我是目標**/
本文鏈接:http://www.tebozhan.com/showinfo-26-11904-0.html如何用裝飾者模式代理final方法
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 面試官最愛問的問題:你了解Spring Cloud的這些組件嗎?
下一篇: 不愧是騰訊天美,面的賊細!