代理模式(Proxy):
代理设计模式是对象的结构模式,原理就是给某个对象提供1个代理对象,并由代理对象来控制对愿对象的援用。在有些情况下,1方不能或不想直接援用1个对象,而代理对象可以在双方之间起到中介的作用,这样可以大大下降彼此的耦合关系,提高彼此的灵活性。下面为代理模式的简略结构类图:
代理模式的角色有3个,分别为:抽象角色、代理角色和具体角色。具体以下:
抽象角色:声明了代理角色和具体角色的共用接口,促使可使用具体实角色的地方都可以使用代理角色。
具体角色:定义代理角色所要代表的具体角色。
代理角色:包括对具体角色的援用,从而可以在任什么时候候操作具体角色对象;代理角色提供了与具体角色相同的接口,可以方便在任什么时候候替换具体角色对象。
下面我们举个实际例子进行说明朝理的使用。在项目当中,我们要实现1个搜索功能,搜索数据之前,需要先验证用户是不是为登录或会员,如果不是会员,那末提示并返回不准即系查询;另外,我们还需要记录会员的搜索记录次数,这样可以帮助运营的后期推行统计哦!固然,这里只是摹拟实现,验证失败则提示权限不够,记录的次数显示为搜索的次数(每次搜索记录便可),而终究搜出的结果,直接显示为搜索的关键字(正常不是这样的哦)。
下面为我的搜索功能的详细类图结构关系:
好了,准备的工作已好了,接下来请看具体的代码实现,具体以下:
ProSearcher:
public interfaceProSearcher {
/**
* 声明1个抽象的方法
*/
StringdoSearch(String userName,Stringpassword,String key);
}
ProRealSearcher:
public class ProRealSearcher implements ProSearcher {
public ProRealSearcher() {
super();
}
/**
* 真实的查询操作在这里进行
*/
@Override
public String doSearch(StringuserName, String password, Stringkey) {
// 参数封装
StringBuffersb = new StringBuffer();
sb.append(userName);
sb.append(password);
sb.append(key);
Stringrequest = sb.toString();
// 网络要求
asyncTask(request);
return key;
}
private void asyncTask(Stringparams) {
// 网络要求核心代码
// TODO
}
}
ProAccessValidator:
public classProAccessValidator {
/**
* 查询前校验用户权限
*/
public booleanvalidateUser(String userName,Stringpassword) {
if("david001".equals(userName) &&
"123456".equals(password)) {
return true;
}
return false;
}
}
ProSearchRecorder:
public classProSearchRecorder {
private StringuserName;
/**
* 返回用户搜索的次数和传递日志到服务端
*/
public int save(int records) {
// 保存本次搜索记录并传递服务器
StringrecordRemote = userName + "次数:" +records;
return save(recordRemote,records);
}
private int save(String record,intrecords) {
records ++;
// 传递记录到服务器
// 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;
}
/**
* 校验用户权限
*/
private booleanvalidateUser(String userName,Stringpassword) {
accessValidate = new ProAccessValidator();
return accessValidate.validateUser(userName, password);
}
/**
* 查询日志操作记录
*/
private voidlogUserRecord(String userName) {
searchRecorder = new ProSearchRecorder();
searchRecorder.setUserName(userName);
}
}
上面为代理模式的核心代码,具体的前端代码这里不罗列出来了,稍后我会将项目代码传递上去。效果图以下:
点击我下载代码!
技术交换群:179914858
上一篇 C++ 运算符重载