代理模式在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

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。