日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

9.代理模式

發布時間:2024/3/7 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9.代理模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引入

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述代理(Proxy)模式的:

代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
在我們實際生活中代理情況無處不在!你在淘寶上面買東西,你使用支付寶平臺支付,賣家請物流公司發貨、你請朋友幫你拿包裹,在這個過程匯總支付寶、物流公司、你朋友都扮演者“第三者”的角色在幫你完成物品的購買,這里的第三者我們可以將其稱之為代理者。

所謂代理就通過引用一個新的對象來實現對真實對象的操作或者將新的對象當做真實對象的一個替身,這種實現的機制就是代理模式,通過引用代理對象來訪問真實對象就是代理模式的設計動機。


定義

代理模式就是給一個對象提供一個代理,并由代理對象控制對原對象的引用。

在代理模式中,“第三者”代理主要是起到一個中介的作用,它連接客戶端和目標對象。


結構

所謂代理,就是一個人或者機構代表另一個人或者機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。

代理模式類圖如下:

在代理模式中的角色:

  • 抽象對象角色:聲明了目標對象和代理對象的共同接口,這樣一來在任何可以使用目標對象的地方都可以使用代理對象。
  • 真實對象角色:它代表著真實對象,是我們最終要引用的對象。
  • 代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象提供一個與目標對象相同的接口,以便可以在任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或之后,執行某個操作,而不是單純地將調用傳遞給目標對象。

  • 代碼實現

    例子一
    讀大學的時候都追過女生吧!某天你看到一位美女,一見鐘情,心里發誓要她做你女朋友。但是你想這樣直接上去可能會唐突了。于是你采用迂回政策,先和她室友搞好關系,然后通過她室友給她禮物。
    抽象主題,送禮物接口:GiveGift.java

    public interface GiveGift {/*** 送花*/void giveFlowers();/*** 送巧克力*/void giveChocolate();/*** 送書*/void giveBook(); }

    你小子:You.java

    public class You implements GiveGift {BeautifulGirl mm ; //美女public You(BeautifulGirl mm){this.mm = mm;}public void giveBook() {System.out.println(mm.getName() +",送你一本書....");}public void giveChocolate() {System.out.println(mm.getName() + ",送你一盒巧克力....");}public void giveFlowers() {System.out.println(mm.getName() + ",送你一束花....");}}

    她閨蜜室友:HerChum.java

    public class HerChum implements GiveGift{You you;public HerChum(BeautifulGirl mm){you = new You(mm);}public void giveBook() {you.giveBook();}public void giveChocolate() {you.giveChocolate();}public void giveFlowers() {you.giveFlowers();}}

    美女一枚:BeautifulGirl.java

    public class BeautifulGirl {String name;public BeautifulGirl(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

    客戶端:Client.java

    public class Client {public static void main(String[] args) {BeautifulGirl mm = new BeautifulGirl("小屁孩...");HerChum chum = new HerChum(mm);chum.giveBook();chum.giveChocolate();chum.giveFlowers();} }

    例子二
    客戶想要找房子,但是自己對周圍的房價或者房源不怎么了解,所以想要通過中介來代理.使用代理模式完成這個場景。
    共同的接口

    public interface Home {public void selectHome(); }

    客戶類

    public class Custom implements Home {@Overridepublic void selectHome() {System.out.println("選擇房子!!!");} }

    中介類

    public class Intermediary implements Home {private Custom custom;public Intermediary(){this.custom = new Custom();}@Overridepublic void selectHome() {before();custom.selectHome();after();}private void before(){System.out.println("中介找房源");}private void after(){System.out.println("簽合同");} }

    測試類

    public class ProxyTest {public static void main(String[] args) {Home home = new Intermediary();home.selectHome();} }

    裝飾器模式和代理模式的區別

    裝飾器模式

    • 裝飾器類和被裝飾類實現同一個接口.
    • 裝飾器類關注于在一個對象上動態的添加方法.
    • 強調:增強方法

    代理模式

    • 代理類和真實處理類實現同一個接口.
    • 代理模式關注于控制對對象的訪問,代理類通過代理模式向訪問他的客戶隱藏了真實調用的對象.
    • 強調:增強

    使用代理模式,代理和真實對象之間的關系在編譯時就已經確定了,而裝飾器者能夠在運行時遞歸的被構造.(代理模式會在代理類中創建真實處理類的一個實例,所以可以確定代理和真實對象的關系,而裝飾器模式是將原始對象作為一個參數傳給裝飾器類)

    優點

  • 職責清晰,真實角色就是實現實際的業務邏輯,不用擔心其它非本職責的事務,通過后期的代理完成一件完成事務,附帶的結果就是編程簡介清晰。在一定程度上降低了系統的耦合度。
  • 代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用.
  • 高擴展性
  • 缺點

  • 由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
  • 實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
  • 適用場景

  • 遠程代理:為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在于不同地址空間的事實。
  • 虛擬代理:通過使用過一個小的對象代理一個大對象。這樣就可以減少系統的開銷。
  • 保護代理:用來控制對真實對象的訪問權限。
  • 總結

  • 代理模式是通過使用引用代理對象來訪問真實對象,在這里代理對象充當用于連接客戶端和真實對象的中介者。
  • 代理模式主要用于遠程代理、虛擬代理和保護代理。其中保護代理可以進行訪問權限控制。
  • 總結

    以上是生活随笔為你收集整理的9.代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。