Java設(shè)計模式以虹貓藍兔的故事講解代理模式
模式: 代理模式
案例: 大奔代干娘賣酒
什么是代理模式
代理模式的定義: 由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標(biāo)對象,代理對象作為訪問對象和目標(biāo)對象之間的中介。
優(yōu)點
1、代理模式在客戶端與目標(biāo)對象之間起到一個中介作用和保護目標(biāo)對象的作用;
2、代理對象可以擴展目標(biāo)對象的功能;
3、代理模式能將客戶端與目標(biāo)對象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴展性
缺點
1、代理模式會造成系統(tǒng)設(shè)計中類的數(shù)量增加
2、在客戶端和目標(biāo)對象之間增加一個代理對象,會造成請求處理速度變慢;
3、增加了系統(tǒng)的復(fù)雜度;
知識點
代理模式的結(jié)構(gòu)比較簡單,主要是通過定義一個繼承抽象主題的代理來包含真實主題,從而實現(xiàn)對真實主題的訪問,下面來分析其基本結(jié)構(gòu)和實現(xiàn)方法。
代理模式實現(xiàn)
案例: 大奔代干娘賣酒
抽象主題(Subject)類:賣酒
真實主題(Real Subject)類:干娘的酒館
代理(Proxy)類:大奔的酒攤
大奔來干娘的酒館前面擺了個攤代理賣酒的生意。
賣酒
一個賣酒接口,聲明了一個賣酒的抽象方法
public interface Jiu { void show(); }
干娘的酒館
干娘的酒館類實現(xiàn)了賣酒的接口,并且實現(xiàn)了show()賣酒方法,聲明了一個酒的名字,和一個aa()方法提示大奔來擺攤了
public class GanNiang implements Jiu { private String name; GanNiang() { } GanNiang(String name) { this.name = name; aa(); } @Override public void show() { System.out.printf("賣出一壇%s", name); } public void aa() { System.out.println("大奔來擺攤了"); } }
大奔的酒攤
大奔的酒攤類實現(xiàn)了賣酒接口,聲明了酒的名字和干娘酒館的屬性,并且實現(xiàn)了賣酒方法。
public class DaBen implements Jiu { private String name; private GanNiang ganNiang; DaBen() { } DaBen(String name) { this.name = name; } @Override public void show() { if (ganNiang == null) { ganNiang = new GanNiang(name); } ganNiang.show(); } }
測試
new一個大奔的酒攤,調(diào)用兩次show()方法,就相當(dāng)于賣了兩次酒。
public class Demo { public static void main(String[] args) { DaBen daBen = new DaBen("女兒紅"); daBen.show(); System.out.println(); System.out.println(); daBen.show(); } }
這里可以看出第一次賣酒和第二次賣酒輸出的結(jié)果不一樣,因為每一次賣酒都要去干娘的酒館拿酒。大奔第一次來拿酒的時候通知干娘,我來擺攤了,后面干娘已經(jīng)知道大奔來了所以再拿酒就不需要通知了。
總結(jié)
代理模式就是找一個代理代替自己去執(zhí)行,這樣只需要避免了重復(fù)new對象的浪費,并且可以找多個代理代替自己。
如:
1、Windows 里面的快捷方式。
2、豬八戒去找高翠蘭結(jié)果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實現(xiàn)了這個接口,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。
3、買火車票不一定在火車站買,也可以去代售點。
4、一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現(xiàn)金,并提供對簽發(fā)人賬號上資金的控制。
到此這篇關(guān)于Java設(shè)計模式以虹貓藍兔的故事講解代理模式的文章就介紹到這了,更多相關(guān)Java代理模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring+Http請求+HttpClient實現(xiàn)傳參
這篇文章主要介紹了Spring+Http請求+HttpClient實現(xiàn)傳參,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Java中json格式化BigDecimal保留2位小數(shù)
這篇文章主要給大家介紹了關(guān)于Java中json格式化BigDecimal保留2位小數(shù)的相關(guān)資料,BigDecimal是Java中的一個數(shù)學(xué)庫,可以實現(xiàn)高精度計算,文中給出了詳細的代碼實例,需要的朋友可以參考下2023-09-09mybatis-plus團隊新作mybatis-mate實現(xiàn)數(shù)據(jù)權(quán)限
本文主要介紹了mybatis-plus 團隊新作 mybatis-mate 輕松搞定數(shù)據(jù)權(quán)限,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09