Java設(shè)計模式以虹貓藍(lán)兔的故事講解代理模式
模式: 代理模式
案例: 大奔代干娘賣酒
什么是代理模式
代理模式的定義: 由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標(biāo)對象,代理對象作為訪問對象和目標(biāo)對象之間的中介。
優(yōu)點(diǎn)
1、代理模式在客戶端與目標(biāo)對象之間起到一個中介作用和保護(hù)目標(biāo)對象的作用;
2、代理對象可以擴(kuò)展目標(biāo)對象的功能;
3、代理模式能將客戶端與目標(biāo)對象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴(kuò)展性
缺點(diǎn)
1、代理模式會造成系統(tǒng)設(shè)計中類的數(shù)量增加
2、在客戶端和目標(biāo)對象之間增加一個代理對象,會造成請求處理速度變慢;
3、增加了系統(tǒng)的復(fù)雜度;
知識點(diǎn)
代理模式的結(jié)構(gòu)比較簡單,主要是通過定義一個繼承抽象主題的代理來包含真實(shí)主題,從而實(shí)現(xiàn)對真實(shí)主題的訪問,下面來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。
代理模式實(shí)現(xiàn)
案例: 大奔代干娘賣酒
抽象主題(Subject)類:賣酒
真實(shí)主題(Real Subject)類:干娘的酒館
代理(Proxy)類:大奔的酒攤
大奔來干娘的酒館前面擺了個攤代理賣酒的生意。
賣酒
一個賣酒接口,聲明了一個賣酒的抽象方法
public interface Jiu {
void show();
}干娘的酒館
干娘的酒館類實(shí)現(xiàn)了賣酒的接口,并且實(shí)現(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("大奔來擺攤了");
}
}大奔的酒攤
大奔的酒攤類實(shí)現(xiàn)了賣酒接口,聲明了酒的名字和干娘酒館的屬性,并且實(shí)現(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對象的浪費(fèi),并且可以找多個代理代替自己。
如:
1、Windows 里面的快捷方式。
2、豬八戒去找高翠蘭結(jié)果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實(shí)現(xiàn)了這個接口,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。
3、買火車票不一定在火車站買,也可以去代售點(diǎn)。
4、一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現(xiàn)金,并提供對簽發(fā)人賬號上資金的控制。
到此這篇關(guān)于Java設(shè)計模式以虹貓藍(lán)兔的故事講解代理模式的文章就介紹到這了,更多相關(guān)Java代理模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mac?Maven環(huán)境搭建安裝和配置超詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Mac?Maven環(huán)境搭建安裝和配置的超詳細(xì)步驟,Maven是一種常用的Java構(gòu)建工具,它可以自動化構(gòu)建、測試和打包Java項目,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議
今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
springboot多數(shù)據(jù)源配合docker部署mysql主從實(shí)現(xiàn)讀寫分離效果
這篇文章主要介紹了springboot多數(shù)據(jù)源配合docker部署mysql主從實(shí)現(xiàn)讀寫分離,通過使用docker獲取mysql鏡像,具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09
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

