最全介绍的代理模式---第一节-静态代理
一、什么是代理?
其實生活中有很多例子:
(1)一件產品,生產出來后,需要代理商來銷售它,我們作為客戶,會通過代理商來買產品,代理商就是我們的代理對象,產品為被代理對象(目標對象)
(2)租房子(中介就是代理對象)等等
二、為什么要代理呢?
(1)代理更專業,也更方便
如:你出國留學,你不會很便利地直接去國外與學校直接交談,但是作為學校地招生代理,有著非常專業地流程,對學校也很了解,你就可以通過招生代理直接了解學校,不用很麻煩地出國。
(2)有時候目標對象對于你來說沒有訪問權限,這時就需要中間代理對象來做中間人代替你訪問。
三、代理模式
1、概念:當一個對象不能直接使用,可以在客戶端和目標對象直接創建一個中介,這個中介就是代理,也就是喂目標對象提供一個替身。
2、作用
(1)訪問控制:在代理中,控制是否可以調用目標對象地方法
(2)功能增強:可以在目標對象實現地基礎上,增強額外地功能操作
如:代理商可以增加商品價格,為自己博得利潤,或者向客戶發放優惠券。
3、被代理的對象
遠程對象,或者創建開銷大的對象,或者需要安全控制的對象,等等。
4、分類
(1)靜態代理模式:代理類是手工實現的Java文件,同時代理的目標對象是規定的。
(2)動態代理模式:在程序執行過程中,使用JDK的反射機制,避免靜態代理的缺點。
JDK代理模式:下節會介紹
Cglib代理模式:下節會介紹
四、靜態代理
1、介紹
代理類是手工實現的Java文件,同時代理的目標對象是規定的。使用時,被代理對象(目標對象)與代理對象都必須實現相同的接口或者繼承相同的父類。2、特點
(1)代理類是自己手工實現的,自己創建一個Java類,表示代理類
(2)你代理的目標對象是確定的
(3)被代理對象(目標對象)與代理對象都必須實現相同的接口或者繼承相同的父類
3、優缺點:
優點:
1)實現簡單,容易理解;
2)在不修改目標對象的功能的前提下,能夠通過代理對象對目標對象實現功能擴展/增強
缺點:當你的項目中,目標類和代理類很多的時候,有以下的缺點
1)當目標類增加了,代理類可能也需要成倍的增加,大力類數量過多
2)當你的接口中功能增加了,或者修改了,會影響眾多的實現類,廠家類、代理類都需要修改。
4、模擬一個用戶購買U盤的行為
產品U盤UsbSell,目標對象:UsbKingFactory,代理對象:Taobao,客戶終端:ShopMain
- 實現步驟:
(1)創建一個接口,定義賣U盤的方法,表示你的廠家和商家做的事情
(2)創建廠家類,實現(1)步驟的接口
(3)創建商家,就是代理,也需要實現(1)中的接口
(4)創建客戶端類,調用商家的方法買一個U盤。
- 其中,代理類完成的功能:
(1)目標類中方法的實現
(2)功能增強
- 代碼:
(1)UsbSell接口
// 表示功能的廠家,或者商家要完成的功能 public interface UsbSell {// 定義方法// amount: 表示一次購買的數量,暫時不用// 返回表示一個U盤的價格float sell(int amount);// 可以定義多個其他的方法 }(2)目標對象:UsbKingFactory類
// 目標類:金士頓廠家,不接用戶的單獨購買 public class UsbKingFactory implements UsbSell {@Overridepublic float sell(int amount) {// 一個128G的U盤85元// 后期可以根據amount,可以實現不同的價格,比如1000個,單價85元,return 85.0f;} }(3)代理對象:Taobao類
// 淘寶是個商家,代理金士頓U盤的銷售 public class Taobao implements UsbSell {//聲明 商家代理的廠家具體是誰private UsbKingFactory factory = new UsbKingFactory();@Override// 實際銷售U盤的功能public float sell(int amount) {// 向廠家發送訂單,告訴廠家,我買了U盤,廠家發貨float price = factory.sell(amount);//廠家的價格// 商家 需要加價,也就是dialing要增加價格// 這里相對于目標對象,就增強了功能// 代理類 在完成目標類方法調用后,增強了功能price += 25;// 在目標類的方法調用后。你做的其他功能,都是增強功能,如發放優惠券System.out.println("淘寶商家,給你返回一個優惠券,或者紅包");return price;} }(4)客戶終端:ShopMain
public class ShopMain {public static void main(String[] args) {// 創建代理商家的 Taobao 對象Taobao taobao = new Taobao();float price = taobao.sell(1);System.out.println("通過淘寶的商家,購買U盤單價:"+price);} }總結
以上是生活随笔為你收集整理的最全介绍的代理模式---第一节-静态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 激光测距仪的发展与介绍——TFN 10K
- 下一篇: 关于CPLD与FPGA的对比分析