代理模式在android中使用
代理模式(Proxy):
代理设计模式是对象的结构模式,原理就是给某个对象提供一个代理对象,并由代理对象来控制对愿对象的引用。在有些情况下,一方不能或不想直接引用一个对象,而代理对象可以在双方之间起到中介的作用,这样可以大大降低彼此的耦合关系,提高彼此的灵活性。下面为代理模式的简略结构类图:
代理模式的角色有三个,分别为:抽象角色、代理角色以及具体角色。具体如下:
抽象角色:声明了代理角色和具体角色的共用接口,促使可以使用具体实角色的地方都可使用代理角色。
具体角色:定义代理角色所要代表的具体角色。
代理角色:包含对具体角色的引用,从而可以在任何时候操作具体角色对象;代理角色提供了与具体角色相同的接口,可以方便在任何时候替代具体角色对象。
下面我们举个实际例子进行说明代理的使用。在项目当中,我们要实现一个搜索功能,搜索数据之前,需要先验证用户是否为登录或会员,如果不是会员,那么提示并返回不准即系查询;另外,我们还需要记录会员的搜索记录次数,这样可以帮助运营的后期推广统计哦!当然,这里只是模拟实现,验证失败则提示权限不够,记录的次数显示为搜索的次数(每次搜索记录即可),而最终搜出的结果,直接显示为搜索的关键字(正常不是这样的哦)。
下面为我的搜索功能的详细类图结构关系:
好了,准备的工作已经好了,接下来请看具体的代码实现,具体如下:
ProSearcher:
public interfaceProSearcher {
/**
* 声明一个抽象的方法
*/
StringdoSearch(String userName,String password,String key);
}
ProRealSearcher:
public class ProRealSearcher implements ProSearcher {
public ProRealSearcher() {
super();
}
/**
* 真正的查询操作在这里进行
*/
@Override
public String doSearch(String userName, String password, String key) {
// 参数封装
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,String password) {
if("david001".equals(userName) &&
"123456".equals(password)) {
return true;
}
return false;
}
}
ProSearchRecorder:
public classProSearchRecorder {
private String userName;
/**
* 返回用户搜索的次数以及传递日志到服务端
*/
public int save(int records) {
// 保存本次搜索记录并传递服务器
StringrecordRemote = userName + "次数:" + records;
return save(recordRemote,records);
}
private int save(String record,int records) {
records ++;
// 传递记录到服务器
// TODO
return records;
}
public voidsetUserName(String name) {
userName = name;
}
}
ProSearcherProxy:
public class ProSearcherProxyimplements ProSearcher {
private ProRealSearcher searcher = null;
private ProAccessValidator accessValidate = null;
private ProSearchRecorder searchRecorder = null;
public ProSearcherProxy() {
searcher = new ProRealSearcher();
}
@Override
public String doSearch(String userName, String password, String key) {
if(validateUser(userName,password)) {
Stringresult = searcher.doSearch(userName, password, key);
logUserRecord(userName);
return result;
}
return null;
}
/**
* 校验用户权限
*/
private booleanvalidateUser(String userName,String password) {
accessValidate = new ProAccessValidator();
return accessValidate.validateUser(userName, password);
}
/**
* 查询日志操作记录
*/
private voidlogUserRecord(String userName) {
searchRecorder = new ProSearchRecorder();
searchRecorder.setUserName(userName);
}
}
上面为代理模式的核心代码,具体的前端代码这里不罗列出来了,稍后我会将项目代码传递上去。效果图如下:
技术交流群:179914858
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。