這篇文章將為大家詳細(xì)講解有關(guān)如何理解Java設(shè)計(jì)模式的代理模式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)主營祥符網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),祥符h5成都小程序開發(fā)搭建,祥符網(wǎng)站營銷推廣歡迎祥符等地區(qū)企業(yè)咨詢
??為其它對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制這個(gè)對(duì)象的訪問。
1)很直接的,實(shí)現(xiàn)同一個(gè)接口或者繼承同一個(gè)抽象類。
2)代理對(duì)象控制對(duì)被代理對(duì)象的訪問。
這是代理模式的通用UML,涉及到的角色如下所示:
??- 抽象主題角色:定義了被代理角色和代理角色的共同接口或者抽象類。
??- 被代理角色:實(shí)現(xiàn)或者繼承抽象主題角色,定義實(shí)現(xiàn)具體業(yè)務(wù)邏輯的實(shí)現(xiàn)。
??- 代理角色:實(shí)現(xiàn)或者繼承抽象主題角色,持有被代理角色的引用,控制和限制被代理角色的實(shí)現(xiàn),并且擁有自己的處理方法(預(yù)處理和善后)
首先是抽象主題角色:
public interface Subject { public void movie(); }
很簡單,單純定義了movie方法,下面看被代理角色的實(shí)現(xiàn):
public class Star implements Subject {
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好");
}
}
被代理角色實(shí)現(xiàn)抽象主題角色,專注實(shí)現(xiàn)被代理角色的業(yè)務(wù)邏輯。繼續(xù)看代理角色:
public class Agent implements Subject {
private Subject star;
public Agent(Subject star) {
this.star = star;
}
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":劇本很好,這部電影接下了");
star.movie();
}
}
代理角色持有被代理角色的引用,要訪問被代理角色必須通過代理,負(fù)責(zé)被代理角色本職之外的職能,并且具有準(zhǔn)入和過濾的功能。最后來看客戶端的實(shí)現(xiàn):
public class Client { public static void main(String[] args) { Subject star = new Star(); Subject proxy = new Agent(star); proxy.movie(); } }
表面上是調(diào)用了代理的方法,實(shí)際的執(zhí)行者其實(shí)是被代理角色Star,看看結(jié)果就知道:
Agent:劇本很好,這部電影接下了
Star:經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好
上面是代理模式其中的一種實(shí)現(xiàn)方式,主要在代理角色Agent中指定了被代理角色Star,意思是經(jīng)紀(jì)人大喊一聲“嘿~兄弟,你是我的了!”。
下面看代理模式的另一種實(shí)現(xiàn)方式,先看抽象主題角色代碼:
public interface Subject { public void movie(); // 指定代理 public Subject getAgent(); }
增加了指定代理的方法getAgent,再來看被代理角色和代理角色代碼:
// 被代理角色
public class Star implements Subject {
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":經(jīng)紀(jì)人接了一部電影,我負(fù)責(zé)拍就好");
}
@Override
public Subject getAgent() { return new Agent(this);
}
}
// 代理角色
public class Agent implements Subject {
private Subject star;
public Agent(Subject star) {
this.star = star;
}
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":劇本題材很好,這部電影接下了");
star.movie();
}
@Override
public Subject getAgent() { return this;
}
}
重點(diǎn)看被代理角色getAgent方法,方法里面指定了Agent為代理,而Agent的getAgent并沒有指定代理。下面看客戶端代碼實(shí)現(xiàn):
public class Client { public static void main(String[] args) { Subject star = new Star(); Subject proxy = star.getAgent(); proxy.movie(); } }
在客戶端通過getAgent得到指定代理角色,由代理來控制star對(duì)象。
運(yùn)行的結(jié)果的跟上一種方式是一樣的。注意,這種方式是客戶端直接訪問被代理角色,代理由被代理角色指定。前面的一種方式則是客戶端不能訪問直接訪問被代理角色,只能訪問代理。但是,無論是哪一種方式,代理模式的實(shí)現(xiàn)都是必須經(jīng)過代理才能訪問被代理模式。就比如明星拍電影,不會(huì)跳過經(jīng)紀(jì)人直接找到明星,而是經(jīng)過經(jīng)紀(jì)人再到明星,要不然經(jīng)紀(jì)人這個(gè)職位豈不是浪費(fèi)了。
關(guān)于如何理解Java設(shè)計(jì)模式的代理模式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章題目:如何理解Java設(shè)計(jì)模式的代理模式
轉(zhuǎn)載注明:http://jinyejixie.com/article46/ppeoeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App設(shè)計(jì)、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、靜態(tài)網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)