作者:京東保險 孫昊宇
大家好,今天我們聊聊設計模式中的代理模式。作為一種經典設計模式,它的應用極為廣泛。不論你是剛剛入門,還是已經熟悉設計模式,相信這篇文章都會讓你有所收獲。
一、引子:叫個代駕
讓我們從一個引子開始:司機和代駕。「私家車司機」和「代駕」是什么關系?很簡單,「私家車司機」是客戶,「代駕」負責提供服務,幫他們開車。
不同點: 「私家車司機」有自己的車,他們可能自己開車,也可能找代駕開車;
「代駕」沒有自己的車,但他們會接到代駕訂單,從而開「私家車司機」的車。
相同點: 他們都會開車,有駕照。換句話說,他們都屬于「司機」。
說到這里,我想他們的關系就很清楚了:「司機」是「私家車司機」和「代駕」的父類。雖然都會開車,但他們對“開車”這個行為有不同的實現。
讓我們把這三個類的關系表示出來。首先定義一個抽象類「司機」,就叫Driver好了:
@Data public abstract class Driver { String name; abstract void driveCar(); }
我們要求每個司機都有一個名字,且都必須會開車。
接下來看看「私家車司機」,CommonDriver類:
@Data public class CommonDriver extends Driver { CommonDriver(String name) { this.name = name; } @Override public void driveCar() { System.out.println(this.getName() + "的汽車正在行駛..."); } }
也很簡單,每次開車的時候打印一行日志即可。最后看看「代駕」,就叫ProxyDriver吧:
@Data public class ProxyDriver extends Driver { private Driver realDriver; ProxyDriver(String name, Driver realDriver) { this.name = name; this.realDriver = realDriver; } @Override void driveCar() { System.out.printf("代駕「%s」正在為%s服務...n", this.getName(), this.getRealDriver().getName()); this.realDriver.driveCar(); } }
我們要求每個代駕都要有一個服務的客戶,也就是被代理的司機。我們將這位被代理的司機——realDriver作為了代駕類的私有變量存起來。當代駕在開車時,他實際上開的是客戶的車。因此,他直接去調用realDriver的開車方法即可。
三個類定義好了,讓我們先創建一個「私家車司機」——小張,讓小張自己開車;再幫他叫一個「代駕」——就叫他小代吧,讓小代幫他開車:
public class Main { public static void main(String[] args) { CommonDriver zhang = new CommonDriver("小張"); zhang.driveCar(); ProxyDriver proxyDriver = new ProxyDriver("小代", zhang); proxyDriver.driveCar(); } }
運行一下:
小張的汽車正在行駛... 代駕小代正在為小張服務... 小張的汽車正在行駛...
結果符合預期:不管是誰在開車,結果都是一樣的,開的都是小張的汽車。
二、代理模式:武器附魔之道
代理模式的定義
以上例子展示了一個代理模式的基本實現。代理模式(Proxy Pattern) 的定義是:使用代理以代替對真實對象的訪問。 它屬于一種結構型設計模式。
例子中的「司機」、「私家車司機」和「代駕」三個角色,分別對應了代理模式中的三個基本元素:
「私家車司機」——真實主題: 被代理的角色,是業務邏輯的具體執行者。
「代駕」——代理主題: 負責代理真實主題,所有對其業務方法的調用,都會被委托給其真實主題實現。
「司機」——抽象主題: 可以是接口,也可以是抽象類。代理主題和真實主題都會去實現/繼承同一個抽象主題。
優點及應用
為真實的對象設置一個代理,可以帶來什么好處?在哪些應用場景下,我們需要用到代理模式?
要回答這個問題,我們不妨想想代理的特點:間接訪問。沒錯,代理模式的優點就在于通過代理間接訪問真實對象。通過間接訪問,我們就可以讓代理做許多中間操作,通過這些中間操作,我們就可以在不修改真實對象的前提下,實現功能增強。
我的理解:如果把真實主題比做一把**「寶劍」,專門用來處理核心邏輯**,那么就可以將它的代理比作**「附魔」,用來給真實主題提供一些強化功能**,附魔的種類就很多啦:火焰
審核編輯 黃宇
-
代理模式
+關注
關注
0文章
4瀏覽量
1788
發布評論請先 登錄
相關推薦
評論