[語法] 代理人設計模式

看板java作者 (= =)時間4月前 (2023/12/11 21:01), 編輯推噓2(201)
留言3則, 2人參與, 4月前最新討論串1/1
最近在研讀Spring AOP,而AOP使用了代理人設計模式,要理解何謂AOP就必須先理解 何謂代理人設計模式,因此我嘗試整理了該設計模式的大綱: 代理人模式從表面上的語法來看,類似在Java IO看到的裝飾者模式, 兩者都是透過包裝某個既有的類別,去增加既有類別的功能。 但是代理人設計模式包裝某類別的目的,是出於增加與業務邏輯無關,額外的功能。 而裝飾者模式的目的是,增加與業務邏輯有關的功能。例如Java IO就是透過裝飾者模式 不斷對物件加強其存取檔案的功能。 代理人模式要如何做到這個目的呢? 就是新增/宣告一種代理類別,將某個包含業務邏輯的物件封裝起來, 這樣該代理類別內,就有一區塊是用於封裝業務邏輯物件;然後於封裝以外的範圍, 去給代理類別增加功能。這樣這個代理類別包含了業務邏輯、又有了額外的功能。 所以就實作了代理人模式。 若某物件的業務邏輯已經定型,不須做額外改變,因此不該隨便去動到該物件時, 透過代理類別去封裝該物件,可避免外部其他物件直接存取到該業務邏輯物件, 外部物件只能存取代理類別new出來的代理物件。這樣可以確保程式的安全性。 ------------------------------------ 而代理人模式又分為靜態代理與動態代理。 靜態代理是直接由程式撰寫者設定代理類別要去代理的物件, 一代理類別對應一被代理物件,那麼多個代理類別,就會去對應多個被代理物件。 這樣實作代理人模式的優點,就是直接把代理規則寫得清清楚楚,因此程式有易讀性。 而動態代理,是不直接對代理類別,指定其要去代理的物件,而是於程式執行過程中 才去動態的決定代理類別要去代理的物件是什麼。 這樣設計的好處是,一個代理類別可以動態的去根據狀況,去代理多個不同的物件, 也就是說程式會變得更靈活; 而動態代理,只要一個代理類別可代理多個代理物件, 比起靜態代理是 「一代理類別只能對應一被代理物件,多個代理類別,去對應多個被代理物件」。 的情形,顯然動態代理可以省下更多的程式碼。 要實作動態代理的類別,除了要去封裝業務邏輯物件 (這時還不知道該業務邏輯物件是什麼,當然也就不知道她的型別,故這時候 業務邏輯物件的型別只能是Object), 還需要另外實作invocationHandler介面的invoke方法, 到時候要透過該方法,去動態決定要代理的物件是什麼? 而當代理類別宣告完成,要去new來使用時,要呼叫proxy類別的newProxyInstance方法 才能使用該代理物件。 ---------------------------------------- 聽起來很複雜,但是Spring AOP透過聲明式的語法,大幅度降低了動態代理的難度。 至於要具體如何透過Spring AOP來做到代理人模式?我還要再研讀下去才會知道。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.216.167.56 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1702299686.A.1B4.html

12/12 23:23, 4月前 , 1F
12/12 23:23, 1F

12/13 09:27, 4月前 , 2F
Spring有提供兩種代理模式 一是你提到的jdk動態代理
12/13 09:27, 2F

12/13 09:27, 4月前 , 3F
二是透過CGlib
12/13 09:27, 3F
文章代碼(AID): #1bTmWc6q (java)
文章代碼(AID): #1bTmWc6q (java)