日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何用裝飾者模式代理final方法

來源: 責編: 時間:2023-09-28 15:52:30 460觀看
導讀裝飾者模式裝飾者模式是一種結構型設計模式,它可以在不改變對象的原有結構的情況下,動態地給對象添加新的功能和職責。裝飾者模式的核心思想是使用組合和委托的方式,讓裝飾者類持有一個被裝飾對象的引用,并在調用被裝飾對

裝飾者模式

裝飾者模式是一種結構型設計模式,它可以在不改變對象的原有結構的情況下,動態地給對象添加新的功能和職責。裝飾者模式的核心思想是使用組合和委托的方式,讓裝飾者類持有一個被裝飾對象的引用,并在調用被裝飾對象的方法之前或之后添加新的行為。這樣,裝飾者類可以在運行時動態地修改被裝飾對象的行為,而不需要創建大量的子類。slI28資訊網——每日最新資訊28at.com

代碼示例:slI28資訊網——每日最新資訊28at.com

// 定義抽象組件類,它是一個接口,定義了被裝飾對象和裝飾對象共同實現的方法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的操作    }}

步驟:

  • 首先,創建一個和目標類相同的接口,或者如果目標類已經實現了一個接口,你可以直接使用它。這個接口定義了目標類的所有公共方法,包括final方法。
  • 然后創建一個裝飾者類,實現這個接口,并在構造函數中傳入一個目標類的實例。在裝飾者類中,可以為每個方法添加代理邏輯,比如打印日志、檢查權限等。然后,可以調用目標類的對應方法,或者直接返回結果。
  • 最后,創建一個裝飾者類的實例,并傳入一個目標類的實例。這樣,就可以通過裝飾者類來代理目標類的所有方法,包括final方法。

代碼示例:slI28資訊網——每日最新資訊28at.com

假設有一個目標類叫做HelloService,它有一個final方法叫做sayHello:slI28資訊網——每日最新資訊28at.com

// 定義一個目標類,其中有一個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方法,您可能需要為每個方法都創建一個裝飾者類,這會增加代碼的復雜度和冗余。slI28資訊網——每日最新資訊28at.com

裝飾者模式和JDK代理的區別:

  • 裝飾者模式和JDK代理都是使用組合而不是繼承來擴展對象的功能,但是它們的目的和實現方式不同。
  • 裝飾者模式是為了增強對象本身的功能,而JDK代理是為了控制對對象的訪問,比如添加權限檢查、日志記錄等。
  • 裝飾者模式是客戶端透明的,也就是說客戶端不需要知道被裝飾的對象是怎么被裝飾的,只需要使用它的增強功能即可。而JDK代理是客戶端不透明的,也就是說客戶端只能看到代理對象,而不能直接訪問被代理的對象。
  • 裝飾者模式是動態的,也就是說可以在運行時根據需要給對象添加不同的裝飾者。而JDK代理是靜態的,也就是說在編譯時就確定了代理對象和被代理對象的關系,不能在運行時改變。
  • 裝飾者模式和JDK代理都需要實現一個共同的接口,以保證類型的一致性。但是裝飾者模式需要在構造函數中傳入被裝飾的對象,而JDK代理則需要通過反射機制來創建被代理的對象。

實際上可以使用Spring AOP實現final方法的代理slI28資訊網——每日最新資訊28at.com

// 定義一個目標類,包含一個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();    }}/**建議之前:這是最后的方法你好,我是目標**/


slI28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11904-0.html如何用裝飾者模式代理final方法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 面試官最愛問的問題:你了解Spring Cloud的這些組件嗎?

下一篇: 不愧是騰訊天美,面的賊細!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲欧美日韩电影| 欧美午夜视频网站| 欧美一区中文字幕| 久久久青草婷婷精品综合日韩| 老鸭窝91久久精品色噜噜导演| 亚洲一区二区免费在线| 小处雏高清一区二区三区| 久久久无码精品亚洲日韩按摩| 欧美黑人国产人伦爽爽爽| 欧美视频一区| 国内久久视频| 日韩视频免费观看高清在线视频| 日韩网站在线看片你懂的| 亚洲欧美国产高清| 久久国产免费| 欧美激情精品久久久久久黑人| 欧美日韩在线视频一区| 国产区日韩欧美| 亚洲国产日韩欧美在线99| 亚洲一区999| 久久先锋资源| 国产精品av久久久久久麻豆网| 韩国成人理伦片免费播放| 日韩一区二区精品葵司在线| 久久精品国产精品亚洲综合| 欧美精品aa| 国产私拍一区| 一区二区三区鲁丝不卡| 久久久精品日韩| 国产精品成av人在线视午夜片| 一区二区视频免费完整版观看| 亚洲图色在线| 欧美风情在线| 国产亚洲成av人片在线观看桃| 亚洲老板91色精品久久| 久久精品国产第一区二区三区最新章节 | 免费成人网www| 国产精品色婷婷久久58| 亚洲精品欧美日韩专区| 久久精品一二三| 欧美成人官网二区| 国产精品乱子乱xxxx| 亚洲国产一区二区三区a毛片| 亚洲欧美色婷婷| 欧美日韩三区| 亚洲国产精品999| 久久国产天堂福利天堂| 国产精品极品美女粉嫩高清在线 | 亚洲欧美中文日韩在线| 欧美日韩国产首页在线观看| 亚洲第一区色| 久久精品成人一区二区三区蜜臀| 国产精品成人久久久久| 亚洲美女黄色片| 免费一级欧美在线大片| 黄色成人在线| 久久国产主播| 国产精品日韩欧美综合 | 亚洲欧美一区二区三区极速播放 | 免费久久99精品国产自| 国产一区二区三区日韩欧美| 亚洲自拍偷拍福利| 欧美午夜电影一区| 夜夜嗨av一区二区三区四季av| 欧美成人精品h版在线观看| 一区二区在线看| 久久精品国产亚洲5555| 国产日韩在线播放| 午夜精品一区二区三区在线 | 在线看片日韩| 久久婷婷蜜乳一本欲蜜臀| 国内精品视频一区| 欧美在线播放| 国产一区二区三区在线免费观看| 欧美一区二区三区另类 | 国产精品视频免费观看www| 亚洲视频一区在线观看| 欧美色一级片| 亚洲婷婷在线| 国产精品久久国产三级国电话系列 | 亚洲另类自拍| 欧美国产三级| 亚洲麻豆视频| 欧美日韩一级黄| 国产精品99久久不卡二区| 国产精品vvv| 亚洲一区免费观看| 国产精品亚发布| 性色av一区二区三区在线观看| 国产九区一区在线| 久久精品91久久久久久再现| 国内精品久久久久久久影视蜜臀| 久久免费视频一区| 亚洲高清色综合| 欧美精品在线观看一区二区| 99精品视频免费观看| 国产精品久久久久9999| 欧美一二区视频| 精品99一区二区| 欧美黄色大片网站| 中文精品视频| 国产欧美亚洲视频| 久久精品在线观看| 亚洲精华国产欧美| 欧美日韩综合在线| 香蕉亚洲视频| 亚洲国产免费看| 欧美日韩国产小视频| 亚洲综合丁香| 狠狠色丁香久久婷婷综合_中| 欧美成人免费网站| 在线综合亚洲| 国产亚洲欧洲997久久综合| 免费欧美视频| 亚洲天堂免费在线观看视频| 国产一区二区三区久久悠悠色av | 欧美成人精品激情在线观看| aⅴ色国产欧美| 国产欧美午夜| 免费观看亚洲视频大全| 一本大道久久a久久综合婷婷| 国产欧美日韩三级| 欧美va天堂| 亚洲女人av| 亚洲国产精品一区制服丝袜| 欧美三区在线| 久久久久综合网| 一区二区三区国产在线| 国产综合久久久久久| 欧美巨乳在线观看| 午夜视频在线观看一区| 亚洲黄色成人久久久| 国产精品一区二区久久| 欧美91视频| 羞羞色国产精品| 亚洲精品免费在线| 国产日韩视频一区二区三区| 欧美精品日日鲁夜夜添| 久久爱www.| aⅴ色国产欧美| 韩国av一区二区三区四区| 欧美日韩一卡二卡| 久久久久九九九| 一本色道88久久加勒比精品| 国内外成人在线| 国产精品v欧美精品∨日韩| 老司机凹凸av亚洲导航| 亚洲在线免费视频| 91久久黄色| 国产一区二区三区四区三区四| 欧美日韩福利| 久热这里只精品99re8久| 亚洲欧美日韩成人| 亚洲美女少妇无套啪啪呻吟| 一区二区三区在线观看视频| 欧美午夜片在线免费观看| 欧美jizzhd精品欧美喷水| 欧美亚洲一区二区三区| 99视频一区二区三区| 悠悠资源网久久精品| 国产伦精品一区二区三| 欧美日韩成人在线观看| 开心色5月久久精品| 欧美亚洲一区二区三区| 一二三区精品| 亚洲国产精品女人久久久| 国产主播精品| 国产精品视频午夜| 欧美日韩国产一中文字不卡| 免费不卡在线观看| 欧美在线一区二区| 亚洲免费在线精品一区| 亚洲精品一级| 亚洲高清不卡一区| 国模吧视频一区| 国产伦精品免费视频| 欧美四级剧情无删版影片| 欧美人交a欧美精品| 欧美a级大片| 久久久人人人| 久久久久国产精品一区| 欧美一区三区三区高中清蜜桃| 亚洲永久免费视频| 国产精品99久久久久久久vr | 欧美阿v一级看视频| 免费观看一区| 蜜臀99久久精品久久久久久软件| 久久国产精品99国产| 午夜精品影院| 午夜精品久久久久久久99水蜜桃| 亚洲午夜国产一区99re久久 | 亚洲欧美日韩精品久久奇米色影视| 亚洲精品自在久久| 亚洲精美视频| 亚洲精品日韩在线观看| 亚洲人精品午夜| 亚洲激情一区| 亚洲人人精品| 亚洲美女在线一区| av不卡在线看| 亚洲婷婷在线| 亚洲免费人成在线视频观看| 亚洲欧美日韩在线播放| 先锋a资源在线看亚洲|