9.代理模式
引入
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述代理(Proxy)模式的:
代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
在我們實際生活中代理情況無處不在!你在淘寶上面買東西,你使用支付寶平臺支付,賣家請物流公司發貨、你請朋友幫你拿包裹,在這個過程匯總支付寶、物流公司、你朋友都扮演者“第三者”的角色在幫你完成物品的購買,這里的第三者我們可以將其稱之為代理者。
所謂代理就通過引用一個新的對象來實現對真實對象的操作或者將新的對象當做真實對象的一個替身,這種實現的機制就是代理模式,通過引用代理對象來訪問真實對象就是代理模式的設計動機。
定義
代理模式就是給一個對象提供一個代理,并由代理對象控制對原對象的引用。
在代理模式中,“第三者”代理主要是起到一個中介的作用,它連接客戶端和目標對象。
結構
所謂代理,就是一個人或者機構代表另一個人或者機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式類圖如下:
在代理模式中的角色:
代碼實現
例子一
讀大學的時候都追過女生吧!某天你看到一位美女,一見鐘情,心里發誓要她做你女朋友。但是你想這樣直接上去可能會唐突了。于是你采用迂回政策,先和她室友搞好關系,然后通過她室友給她禮物。
抽象主題,送禮物接口:GiveGift.java
你小子: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 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();} }裝飾器模式和代理模式的區別
裝飾器模式
- 裝飾器類和被裝飾類實現同一個接口.
- 裝飾器類關注于在一個對象上動態的添加方法.
- 強調:增強方法
代理模式
- 代理類和真實處理類實現同一個接口.
- 代理模式關注于控制對對象的訪問,代理類通過代理模式向訪問他的客戶隱藏了真實調用的對象.
- 強調:增強
使用代理模式,代理和真實對象之間的關系在編譯時就已經確定了,而裝飾器者能夠在運行時遞歸的被構造.(代理模式會在代理類中創建真實處理類的一個實例,所以可以確定代理和真實對象的關系,而裝飾器模式是將原始對象作為一個參數傳給裝飾器類)
優點
缺點
適用場景
總結
總結
- 上一篇: ESP8266-Arduino编程实例-
- 下一篇: 微信小程序--公共组件使用