首页
/
每日頭條
/
生活
/
代理模式詳解教程
代理模式詳解教程
更新时间:2025-02-03 03:54:31

代理模式又稱為委托模式。代理模式從字面上很好理解,有些事情你可以不必親自去做,而是通過更為專業的人或者機構去做。比如你開公司需要工商注冊。你可以選擇自己去了解相關的規章制度,親自跑腿去辦理。也可以通過專業機構辦理。這樣你就不需要去了解辦理的細節,隻需把材料交給機構。機構會為你完成注冊工作。在這個過程中,機構不但會為你完成機構注冊,而且還有可能為你辦理一些你并不知道的增值服務。這就是典型的代理模式。

1. 實現代理模式

我們再看一個生活中的例子。房屋買賣中經常會出現代理的情況。當賣家不在房屋所在地時,可能會委托自己的親人或者朋友進行交易。而買方會和代理人直接進行交易。交易中間的問題代理人會回答,手續代理人會辦理。如下圖:

代理模式詳解教程(代理模式你用過嗎)1

這個代理人不太老實,私自加了20萬,想賺差價。所以不要以為代理人真的隻是代理,在這個過程中他可以加入自己的邏輯處理。而客戶和被代理人并不知道。

我們看看采用代理模式如何實現這個場景。

首先真正賣掉房子的還是房主,隻不過和買房人直接進行買賣的是代理人。那麼房主和代理人有一個公共的行為都是賣房。那麼我們可以抽象出一個接口定義賣房的行為。房主和代理人都需要實現這個接口。真正的賣房邏輯在房主的實現中,代理人的賣房實現隻是調用房主的實現而已。要達到這個目的,代理人需要持有房主的引用。而買方進行買賣的時候,僅和代理人打交道。不用知道房主是誰,也不用讓房主到現場過戶。甚至連房主身在何處都不知道。

上面其實就是這個例子的程序設計。代碼如下:

房屋交易接口代碼:

public interface RealEstate { void sell(); }

房主代碼:

public class Seller implements RealEstate { @Override public void sell() { System.out.println("賣了房子"); } }

代理人代碼:

public class SellerProxy implements RealEstate{ private Seller seller; @Override public void sell() { if(seller==null){ seller = new Seller(); } seller.sell(); System.out.println("退稅辦理完畢"); } }

類圖:

代理模式詳解教程(代理模式你用過嗎)2

代理人在這裡有什麼用處呢?沒有代理人,直接和房主買就好了啊?試想下,假如現在有了新的買房政策,交易完成後可以退稅,那麼在不修改房主代碼的前提下,我們隻需要修改此代理人的代碼即可。如果在其他地方賣房沒有此政策,隻需要定義另外一個地區的代理人即可,這裡實現了開閉原則。其實代理模式還有很多好處和适用的場景。我們下面詳細來看。

2. 代理模式優缺點2.1 優點

代理模式在客戶端代碼和真正的邏輯代碼中引入了一層代理,這樣做有很多好處:代理模式

  1. 隐藏邏輯的真正實現對象。上面的例子中,如果賣房人身份特殊,那麼通過代理人來賣房,可以不讓買房人接觸到自己;
  2. 隐藏委托類的某些行為,在代理類認為應該觸發時再觸發;
  3. 代理類可以為委托類的行為附加一些邏輯處理,例如上例中的退稅。
2.2 缺點
  1. 代理類和委托類實現同一個接口,因此隻能面向接口代理;
  2. 代理類和委托類實現同一個接口。即使代理類隻想代理某個行為,也需要實現接口所有方法;
  3. 代理類和委托類需要一一對應。如果你有段邏輯需要對所有的方法都附加上,靜态代理是無法實現的。
3. 代理模式适用場景

針對代理模式的三個優點,我們來看看有哪些适用場景。

  1. 遠程調用代理:在分布式系統中,我們經常會調用其他系統的服務。通過代理模式,可以對客戶端代碼隐藏遠程調用的細節;
  2. 虛代理:有一個典型的場景,加載一個包含大量大 size 圖片的頁面時,為了更好的用戶體驗,可以通過圖片代理類先把圖片的位置占好,保證排版的正确。當滾動到某個圖片位置的時候才去加載圖片;
  3. 保護代理:當委托對象需要訪問權限控制時,可以通過代理類來控制權限進行保護;
  4. 智能指引:為委托對象增加一層控制。比如記錄訪問次數,當為 0 的時候,可以釋放掉。第一次引用一個對對象時,把它裝入内存。訪問委托對象前,檢查是否已經有其他訪問已經鎖定了它,以确保其他對象不能改變它。
4. 小結

代理模式由 Suject 接口,RealSubject 實現和 Proxy 類構成。Proxy 類同樣要實現 Suject 接口。同時 Proxy 類依賴 RealSubject 類。代理模式對方的調用增加了間接性。利用間接性,可以加入額外的邏輯。這也是我們常說的 AOP,即面向切面編程。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
dnf國服特色改版
dnf國服特色改版
西海岸又更新增加了全新的内容,而正式服實裝日期也确定在了下周4,也就是5月24号更新維護那天。這次更新的内容不僅有大家非常期待的職業平衡調整,還有全新的異界遠古地下城的加入!雖然國服特色Raid惡魔團戰依然沒有消息,不過我們卻迎來了另外一個...
2025-02-03
焖燒罐可以焖什麼吃
焖燒罐可以焖什麼吃
小小一個焖燒罐,輕輕松松做甜品,色香味俱全,你心動嗎?最近随着很多單位的複工,身邊有不少朋友發圈表示,上班以後吃飯成了難題,尤其是一些姑娘們,想念往日的下午茶,卻吃不到!不過這也難不到聰明的小夥伴,即使點不了外賣,利用手邊的一些瓶瓶罐罐,一...
2025-02-03
雍正為什麼喜歡跪下
雍正為什麼喜歡跪下
雍正畫像說起雍正,大多數人對他的印象,可能還停留在曆史書上那個酷吏反腐、獎掖勤能、整頓朝綱、改土歸流、創建軍機處等,是為乾隆盛世奠定基石的賢君明主。他當了13年皇帝,每天勤勉克制,平均睡眠不超過4小時,一年裡也隻有生日那天才休息,有人給他統...
2025-02-03
關于可愛小清新的聖誕節心情說說
關于可愛小清新的聖誕節心情說說
關于可愛小清新的聖誕節心情說說?我的每一下心跳想你一次,直到我生命休止,心不再跳動!我愛你!聖誕快樂!,下面我們就來說一說關于關于可愛小清新的聖誕節心情說說?我們一起去了解并探讨一下這個問題吧!關于可愛小清新的聖誕節心情說說我的每一下心跳想...
2025-02-03
21條道路交通标志線你都認全了嗎
21條道路交通标志線你都認全了嗎
《道路交通标志和标線第2部分:道路交通标志》(GB5768.2—2022)即将于今年10月1日實施。該标準是市場監管總局(标準委)會同交通運輸部、公安部,組織全國交通工程設施(公路)标準化技術委員會,對2009年版道路交通标志強制性國家标準...
2025-02-03
Copyright 2023-2025 - www.tftnews.com All Rights Reserved