這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Java中如何實(shí)現(xiàn)代理模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、慶城ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的慶城網(wǎng)站制作公司
簡介摘要: 代理模式是GOF設(shè)計(jì)模式中的一種,常用于權(quán)限模塊的架構(gòu)設(shè)計(jì),其根本的原理是通過將一個(gè)代理對(duì)象交給調(diào)用者,使得調(diào)用者不能直接使用相應(yīng)的功能模塊,所 有的調(diào)用被傳遞給代理對(duì)象,代理對(duì)象負(fù)責(zé)對(duì)真實(shí)模塊完成調(diào)用,在調(diào)用者與被調(diào)用者之間建立了一個(gè)隔離帶,我們可以使 代理模式是GOF設(shè)計(jì)模式中的一種,常用于權(quán)限模塊的架構(gòu)設(shè)計(jì),其根本的原理是通過將一個(gè)代理對(duì)象交給調(diào)用者,使得調(diào)用者不能直接使用相應(yīng)的功能模塊,所有的調(diào)用被傳遞給代理對(duì)象,代理對(duì)象負(fù)責(zé)對(duì)真實(shí)模塊完成調(diào)用,在調(diào)用者與被調(diào)用者[bei tiao yong zhe]之間建立了一個(gè)隔離帶,我們可以使用這個(gè)隔離帶進(jìn)行權(quán)限檢查、對(duì)象的延遲[yan chi] 加載等功能的實(shí)現(xiàn)。這里不對(duì)這個(gè)設(shè)計(jì)模式的具體原理多加解釋[jie shi],我們直接通過一個(gè)實(shí)例的編寫來完成對(duì)代理模式的應(yīng)用[ying yong],在理解了代理模式之后,我們將繼續(xù)介紹 java中提供的一種動(dòng)態(tài)[dong tai]代理技術(shù)與其實(shí)現(xiàn)。
這里我們假設(shè)有一個(gè)用戶管理模塊,這個(gè)模塊提供了添加用戶、刪除用戶的功能。我們現(xiàn)在要使用代理模式來檢查權(quán)限該如何實(shí)現(xiàn)呢?首先我們需要具有一個(gè)類叫User用來表示一個(gè)用戶的信息[xin xi],代碼如下:
public class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } }
為了提供功能模塊,并且希望[xi wang]能夠隔離模塊,我們需要設(shè)計(jì)一個(gè)接口來定義用戶管理模塊的接口,這里我們定義IUserFace接口,代碼如下:
public interface IUserFace { public void addUser(User user); public void removeUser(User user); }
接下來為這個(gè)接口編寫一個(gè)真正實(shí)現(xiàn)具體功能的類出來,定義為UserFaceImpl,代碼如下:
public class UserFaceImpl implements IUserFace { public void addUser(User user) { //這里處理相關(guān)的添加用戶的代碼任務(wù) //比如說連接數(shù)據(jù)庫,執(zhí)行相關(guān)的SQL語句 System.out.println("Add User Successfully"); } public void removeUser(User user) { //這里處理相關(guān)的刪除用戶的代碼任務(wù) //比如說連接數(shù)據(jù)庫,執(zhí)行相關(guān)的SQL語句 System.out.println("Remove User Successfully"); } }
好了,現(xiàn)在我們對(duì)外提供的功能具備了,那么使用者該如何使用這個(gè)功能的實(shí)現(xiàn)類呢?為了讓外界對(duì)具體功能類的使用透明[tou ming]化,我們實(shí)現(xiàn)一個(gè)工廠類來負(fù)責(zé)創(chuàng)造具體功能模塊的對(duì)象,并以接口的形式提供外界使用,這樣將來更換相關(guān)模塊的使用將會(huì)比較方便。具體工廠類(FaceFactory)代碼如下:
public class FaceFactory { private static FaceFactory instance; private FaceFactory() { } public static FaceFactory getInstance() { if(instance == null) { instance = new FaceFactory(); } return instance; } public IUserFace createUserFace() { return new UserFaceImpl(); } }
完成了工廠類的代碼,我們可以使用具體模塊,這里我們編寫一個(gè)App.java來使用以下具體功能模塊,代碼如下:
public class App { public static void main(String args[]) { User u = new User(); IUserFace uf = FaceFactory.getInstance().createUserFace(); uf.addUser(u); } }
從上面代碼我們可以看到,代碼中并沒有提及UserFaceImpl這個(gè)類,這保證了將來如果需要跟換UserFaceImpl這個(gè)類的使用,調(diào)用者的代碼將不需要做任何的修改[xiu gai]。好了,現(xiàn)在我們要來研究一下權(quán)限的問題[wen ti],在這個(gè)例子中,我們可能需要在添加用戶或者刪除用戶的時(shí)候進(jìn)行權(quán)限檢查,符合權(quán)限的才能執(zhí)行相關(guān)動(dòng)作,否則不能執(zhí)行,那么該如何修改[xiu gai]代碼才能更加貼切,而且在實(shí)際的編寫過程中,雖然我們需要權(quán)限模塊,但有時(shí)候?yàn)榱烁玫乜焖贉y試,我們常常希望暫時(shí)關(guān)閉權(quán)限模塊,如何才能讓這樣的臨時(shí)需求[xu qiu]變得更加容易處理呢?我們現(xiàn)在使用代理模式來完成這樣的任務(wù),現(xiàn)在繼續(xù)編寫一個(gè)類叫 UserFaceProxy,讓它也實(shí)現(xiàn)IUserFace接口,也許你會(huì)說,不是已經(jīng)有一個(gè)類實(shí)現(xiàn)了這個(gè)接口了嗎?為什么還要寫一個(gè)?不要著急,看完這個(gè)代碼,你就會(huì)了解其中的道理了。
public class UserFaceProxy implements IUserFace { private IUserFace userFace; public UserFaceProxy(IUserFace userFace) { this.userFace = userFace; } public void addUser(User user) { //在這里檢查權(quán)限,如果權(quán)限不合法則拋出[pao chu]異常[yi chang][pao chu yi chang] //如果權(quán)限通過則完成下面的工作 userFace.addUser(user); } public void removeUser(User user) { //在這里檢查權(quán)限,如果權(quán)限不合法則拋出[pao chu]異常[yi chang][pao chu yi chang] //如果權(quán)限通過則完成下面的工作 userFace.removeUser(user); } }
在代碼中你可以看到,這個(gè)代理類在構(gòu)造對(duì)象的時(shí)候需要傳入一個(gè)實(shí)現(xiàn)了IUserFace接口的類的對(duì)象,當(dāng)代理類對(duì)象的方法[fang fa]被調(diào)用的時(shí)候,首先檢查權(quán)限,如果權(quán)限檢查不通過,那么則拋出[pao chu]異常[yi chang][pao chu yi chang],通過的話則調(diào)用構(gòu)造時(shí)傳入對(duì)象的相應(yīng)方法[fang fa]來完成真是的工作。這樣的話,我們需要繼續(xù)修改[xiu gai]工廠類的代碼如下:
public class FaceFactory { private static FaceFactory instance; private FaceFactory() { } public static FaceFactory getInstance() { if(instance == null) { instance = new FaceFactory(); } return instance; } public IUserFace createUserFace() { IUserFace userFace = new UserFaceImpl(); IUserFace proxy = new UserFaceProxy(userFace); return proxy; } }
上述就是小編為大家分享的Java中如何實(shí)現(xiàn)代理模式了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。