Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解代理模式
模式: 代理模式
案例: 大奔代干娘賣(mài)酒
什么是代理模式
代理模式的定義: 由于某些原因需要給某對(duì)象提供一個(gè)代理以控制對(duì)該對(duì)象的訪問(wèn)。這時(shí),訪問(wèn)對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,代理對(duì)象作為訪問(wèn)對(duì)象和目標(biāo)對(duì)象之間的中介。
優(yōu)點(diǎn)
1、代理模式在客戶端與目標(biāo)對(duì)象之間起到一個(gè)中介作用和保護(hù)目標(biāo)對(duì)象的作用;
2、代理對(duì)象可以擴(kuò)展目標(biāo)對(duì)象的功能;
3、代理模式能將客戶端與目標(biāo)對(duì)象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴(kuò)展性
缺點(diǎn)
1、代理模式會(huì)造成系統(tǒng)設(shè)計(jì)中類的數(shù)量增加
2、在客戶端和目標(biāo)對(duì)象之間增加一個(gè)代理對(duì)象,會(huì)造成請(qǐng)求處理速度變慢;
3、增加了系統(tǒng)的復(fù)雜度;
知識(shí)點(diǎn)
代理模式的結(jié)構(gòu)比較簡(jiǎn)單,主要是通過(guò)定義一個(gè)繼承抽象主題的代理來(lái)包含真實(shí)主題,從而實(shí)現(xiàn)對(duì)真實(shí)主題的訪問(wèn),下面來(lái)分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。
代理模式實(shí)現(xiàn)
案例: 大奔代干娘賣(mài)酒
抽象主題(Subject)類:賣(mài)酒
真實(shí)主題(Real Subject)類:干娘的酒館
代理(Proxy)類:大奔的酒攤
大奔來(lái)干娘的酒館前面擺了個(gè)攤代理賣(mài)酒的生意。
賣(mài)酒
一個(gè)賣(mài)酒接口,聲明了一個(gè)賣(mài)酒的抽象方法
public interface Jiu {
void show();
}干娘的酒館
干娘的酒館類實(shí)現(xiàn)了賣(mài)酒的接口,并且實(shí)現(xiàn)了show()賣(mài)酒方法,聲明了一個(gè)酒的名字,和一個(gè)aa()方法提示大奔來(lái)擺攤了
public class GanNiang implements Jiu {
private String name;
GanNiang() {
}
GanNiang(String name) {
this.name = name;
aa();
}
@Override
public void show() {
System.out.printf("賣(mài)出一壇%s", name);
}
public void aa() {
System.out.println("大奔來(lái)擺攤了");
}
}大奔的酒攤
大奔的酒攤類實(shí)現(xiàn)了賣(mài)酒接口,聲明了酒的名字和干娘酒館的屬性,并且實(shí)現(xiàn)了賣(mài)酒方法。
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();
}
}測(cè)試
new一個(gè)大奔的酒攤,調(diào)用兩次show()方法,就相當(dāng)于賣(mài)了兩次酒。
public class Demo {
public static void main(String[] args) {
DaBen daBen = new DaBen("女兒紅");
daBen.show();
System.out.println();
System.out.println();
daBen.show();
}
}
這里可以看出第一次賣(mài)酒和第二次賣(mài)酒輸出的結(jié)果不一樣,因?yàn)槊恳淮钨u(mài)酒都要去干娘的酒館拿酒。大奔第一次來(lái)拿酒的時(shí)候通知干娘,我來(lái)擺攤了,后面干娘已經(jīng)知道大奔來(lái)了所以再拿酒就不需要通知了。
總結(jié)
代理模式就是找一個(gè)代理代替自己去執(zhí)行,這樣只需要避免了重復(fù)new對(duì)象的浪費(fèi),并且可以找多個(gè)代理代替自己。
如:
1、Windows 里面的快捷方式。
2、豬八戒去找高翠蘭結(jié)果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來(lái),高翠蘭本人和孫悟空都實(shí)現(xiàn)了這個(gè)接口,豬八戒訪問(wèn)高翠蘭的時(shí)候看不出來(lái)這個(gè)是孫悟空,所以說(shuō)孫悟空是高翠蘭代理類。
3、買(mǎi)火車票不一定在火車站買(mǎi),也可以去代售點(diǎn)。
4、一張支票或銀行存單是賬戶中資金的代理。支票在市場(chǎng)交易中用來(lái)代替現(xiàn)金,并提供對(duì)簽發(fā)人賬號(hào)上資金的控制。
到此這篇關(guān)于Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解代理模式的文章就介紹到這了,更多相關(guān)Java代理模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mac?Maven環(huán)境搭建安裝和配置超詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Mac?Maven環(huán)境搭建安裝和配置的超詳細(xì)步驟,Maven是一種常用的Java構(gòu)建工具,它可以自動(dòng)化構(gòu)建、測(cè)試和打包Java項(xiàng)目,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議
今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
簡(jiǎn)單了解java ibatis #及$的區(qū)別和用法
這篇文章主要介紹了簡(jiǎn)單了解java ibatis #及$的區(qū)別和用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
springboot多數(shù)據(jù)源配合docker部署mysql主從實(shí)現(xiàn)讀寫(xiě)分離效果
這篇文章主要介紹了springboot多數(shù)據(jù)源配合docker部署mysql主從實(shí)現(xiàn)讀寫(xiě)分離,通過(guò)使用docker獲取mysql鏡像,具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09
使用SpringBoot整合ssm項(xiàng)目的實(shí)例詳解
Spring Boot 現(xiàn)在已經(jīng)成為 Java 開(kāi)發(fā)領(lǐng)域的一顆璀璨明珠,它本身是包容萬(wàn)象的,可以跟各種技術(shù)集成。這篇文章主要介紹了使用SpringBoot整合ssm項(xiàng)目,需要的朋友可以參考下2018-11-11
k8s部署的java服務(wù)添加idea調(diào)試參數(shù)的方法
文章介紹了如何在K8S容器中的Java服務(wù)上進(jìn)行遠(yuǎn)程調(diào)試,包括配置Deployment、Service以及本地IDEA的調(diào)試設(shè)置,感興趣的朋友跟隨小編一起看看吧2025-02-02
Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式詳解
這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02

