[語法] 代理人設計模式
最近在研讀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
12/13 09:27, 2F
→
12/13 09:27,
4月前
, 3F
12/13 09:27, 3F
java 近期熱門文章
PTT數位生活區 即時熱門文章