摘要:代理模式的定義來源于百度百科為其他對象提供一種代理以控制對這個對象的訪問。二來源大話設計模式三例子實現現在根據上面購票代理的場景來實現例子接口,定義真實火車站,還有代理提供的服務。
一、定義? ? ? ?在網絡不發達之前,我們買火車票,通常都需要跑到火車站去買。這對于我們來說可能有些麻煩,偶然有一天,你發現你樓下有一家便利店居然能買火車票,這就方便很多。其實啊,便利店并不提供火車服務,也沒有權利發行火車票,所以它只是提供了代理,代理了火車站的購票服務,這就是一種代理模式。
代理模式的定義(來源于百度百科):為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
從定義了,我們就可以知道代理模式的作用了,提供對真實對象的代理,可以達到對訪問真實對象的控制,起到中介的作用。
二、UML來源:《大話設計模式》
現在根據上面購票代理的場景來實現例子
1、接口,定義真實火車站,還有代理提供的服務。
package com.design.proxy; public interface TrainServiceInf { public void saleTicket(); }
2、火車站類,真正提供買票服務
package com.design.proxy;
/** * 被代理的真實對象 */
public class TrainStation implements TrainServiceInf {
@Override
public void saleTicket()
{
System.out.println("今天心情好,賣給你一張票!");
}
}
3、定義代理類,持有真實對象的引用
package com.design.proxy;public
class TrainProxy implements TrainServiceInf{
private TrainServiceInf trainServiceInf;
public TrainProxy(){
trainServiceInf = new TrainStation();
}
@Override
public void saleTicket() {
System.out.println("購票還跑去火車站,你out了,跑去了也不一定賣給你,給點手續費,我保證幫你買到!!");
//真正去購票
trainServiceInf.saleTicket();
}
}
客戶端調用
package com.design.proxy; public class TestMain { public static void main(String[] args) { TrainServiceInf trainProxy = new TrainProxy(); //通過代理類來買票 trainProxy.saleTicket(); } }
四、應用場景
1、遠程代理
為一個對象在不同的地址空間提供局部代表,隱藏一個對象在不同地址空間的事實。這個在遠程調用中,是個很明顯的體現。比如我們通過一個對象來代理遠程服務,調用這個對象的方法,則會相應的調用遠程的方法。所以該對象為遠程服務的一個代理。
2、虛擬代理
需要創建開銷大的對象,通過它來存放實例化需要很長時間的真實對象。
3、安全代理
用來控制真實對象訪問時的權限,如上面的購票例子中,我們可以在購票方法上加入一個身份證號碼參數,客戶端傳過來省份證號碼,代理類里面進行驗證,發現省份證為老賴的,則不讓購票【手動滑稽】。
4、智能指引
比如說上面購買車票,可能購買車票還得先錄入省份證信息等其他操作。我們其實不想知道得干嘛,我們的目的很簡單就是買到一張票。代理賣票服務的便利店會幫我們完成這一系列的操作包括:錄入省份證信息+買票。
五、總結說明需要注意的是,以上編寫的為靜態代理,即代碼運行前代理類就已經是編寫好的了,至于動態代理,代理類是在運行時才生成的,這里先不做介紹,后續會另外的文章介紹。代理模式本質上就是通過代理對象來對真實對象的訪問,那么為什么不直接掉真實對象呢??那時因為調真實對象前,我們還需要做其他操作,這個操作又不屬于真實對象提供的服務。業務上,他并不屬于真實對象。比如說調用前做安全驗證、或者組合幾個操作。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7848.html
摘要:虛擬代理如果需要創建一個資源消耗較大的對象,先創建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創建。虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統資源的消耗,對系統進行優化并提高運行速度。 概念 代理模式(Proxy Pattern) :一種對象結構型模式。給某一個對象提供一個代理,并由代理對象控制對原對象的引用。 UML showImg(https://seg...
摘要:聊完了工廠模式,下面我們來說框架中的另一個核心設計模式代理模式。這里的外賣小哥就相當于是我們的代理。主要分為代理和代理。 聊完了工廠模式,下面我們來說Spring框架中的另一個核心設計模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先舉個吃飯的例子:比如說我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、...
摘要:最近在讀設計模式與開發實踐,在這里把文中的各種設計模式寫出來,以便加深記憶,也可以分享給初學者。經紀人可以全權代表明星和客戶談判,最后把談判結果給明星,明星決定簽約與否。這也違反了面向對象設計原則中的單一職責原則。 最近在讀《javascript設計模式與開發實踐》,在這里把文中的各種設計模式寫出來,以便加深記憶,也可以分享給初學者。如果你不了解設計模式,那么強烈推薦你閱讀一下這本書,...
摘要:什么是代理模式代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。又稱單一功能原則,面向對象五個基本原則之一。 什么是代理模式 代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。而在JS當中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態加載一個對象,可...
閱讀 1823·2023-04-26 02:32
閱讀 571·2021-11-18 13:12
閱讀 2455·2021-10-20 13:48
閱讀 2523·2021-10-14 09:43
閱讀 3832·2021-10-11 10:58
閱讀 3502·2021-09-30 10:00
閱讀 2937·2019-08-30 15:53
閱讀 3493·2019-08-30 15:53