代理模式(Proxy):
代理設(shè)計(jì)模式是對(duì)象的結(jié)構(gòu)模式,原理就是給某個(gè)對(duì)象提供1個(gè)代理對(duì)象,并由代理對(duì)象來(lái)控制對(duì)愿對(duì)象的援用。在有些情況下,1方不能或不想直接援用1個(gè)對(duì)象,而代理對(duì)象可以在雙方之間起到中介的作用,這樣可以大大下降彼此的耦合關(guān)系,提高彼此的靈活性。下面為代理模式的簡(jiǎn)略結(jié)構(gòu)類(lèi)圖:
代理模式的角色有3個(gè),分別為:抽象角色、代理角色和具體角色。具體以下:
抽象角色:聲明了代理角色和具體角色的共用接口,促使可使用具體實(shí)角色的地方都可以使用代理角色。
具體角色:定義代理角色所要代表的具體角色。
代理角色:包括對(duì)具體角色的援用,從而可以在任什么時(shí)候候操作具體角色對(duì)象;代理角色提供了與具體角色相同的接口,可以方便在任什么時(shí)候候替換具體角色對(duì)象。
下面我們舉個(gè)實(shí)際例子進(jìn)行說(shuō)明朝理的使用。在項(xiàng)目當(dāng)中,我們要實(shí)現(xiàn)1個(gè)搜索功能,搜索數(shù)據(jù)之前,需要先驗(yàn)證用戶(hù)是不是為登錄或會(huì)員,如果不是會(huì)員,那末提示并返回不準(zhǔn)即系查詢(xún);另外,我們還需要記錄會(huì)員的搜索記錄次數(shù),這樣可以幫助運(yùn)營(yíng)的后期推行統(tǒng)計(jì)哦!固然,這里只是摹擬實(shí)現(xiàn),驗(yàn)證失敗則提示權(quán)限不夠,記錄的次數(shù)顯示為搜索的次數(shù)(每次搜索記錄便可),而終究搜出的結(jié)果,直接顯示為搜索的關(guān)鍵字(正常不是這樣的哦)。
下面為我的搜索功能的詳細(xì)類(lèi)圖結(jié)構(gòu)關(guān)系:
好了,準(zhǔn)備的工作已好了,接下來(lái)請(qǐng)看具體的代碼實(shí)現(xiàn),具體以下:
ProSearcher:
public interfaceProSearcher {
/**
* 聲明1個(gè)抽象的方法
*/
StringdoSearch(String userName,Stringpassword,String key);
}
ProRealSearcher:
public class ProRealSearcher implements ProSearcher {
public ProRealSearcher() {
super();
}
/**
* 真實(shí)的查詢(xún)操作在這里進(jìn)行
*/
@Override
public String doSearch(StringuserName, String password, Stringkey) {
// 參數(shù)封裝
StringBuffersb = new StringBuffer();
sb.append(userName);
sb.append(password);
sb.append(key);
Stringrequest = sb.toString();
// 網(wǎng)絡(luò)要求
asyncTask(request);
return key;
}
private void asyncTask(Stringparams) {
// 網(wǎng)絡(luò)要求核心代碼
// TODO
}
}
ProAccessValidator:
public classProAccessValidator {
/**
* 查詢(xún)前校驗(yàn)用戶(hù)權(quán)限
*/
public booleanvalidateUser(String userName,Stringpassword) {
if("david001".equals(userName) &&
"123456".equals(password)) {
return true;
}
return false;
}
}
ProSearchRecorder:
public classProSearchRecorder {
private StringuserName;
/**
* 返回用戶(hù)搜索的次數(shù)和傳遞日志到服務(wù)端
*/
public int save(int records) {
// 保存本次搜索記錄并傳遞服務(wù)器
StringrecordRemote = userName + "次數(shù):" +records;
return save(recordRemote,records);
}
private int save(String record,intrecords) {
records ++;
// 傳遞記錄到服務(wù)器
// TODO
return records;
}
public voidsetUserName(String name) {
userName = name;
}
}
ProSearcherProxy:
public class ProSearcherProxyimplements ProSearcher {
private ProRealSearchersearcher = null;
private ProAccessValidatoraccessValidate = null;
private ProSearchRecordersearchRecorder = null;
public ProSearcherProxy() {
searcher = new ProRealSearcher();
}
@Override
public String doSearch(StringuserName, String password, Stringkey) {
if(validateUser(userName,password)) {
Stringresult = searcher.doSearch(userName, password, key);
logUserRecord(userName);
returnresult;
}
return null;
}
/**
* 校驗(yàn)用戶(hù)權(quán)限
*/
private booleanvalidateUser(String userName,Stringpassword) {
accessValidate = new ProAccessValidator();
return accessValidate.validateUser(userName, password);
}
/**
* 查詢(xún)?nèi)罩静僮饔涗?/span>
*/
private voidlogUserRecord(String userName) {
searchRecorder = new ProSearchRecorder();
searchRecorder.setUserName(userName);
}
}
上面為代理模式的核心代碼,具體的前端代碼這里不羅列出來(lái)了,稍后我會(huì)將項(xiàng)目代碼傳遞上去。效果圖以下:
點(diǎn)擊我下載代碼!
技術(shù)交換群:179914858