代理模式在android中使用

代理模式(Proxy):

代理设计模式是对象的结构模式,原理就是给某个对象提供一个代理对象,并由代理对象来控制对原对象的引用。在有些情况下,一方不能或不想直接引用一个对象,而代理对象可以在双方之间起到中介的作用,这样可以大大降低彼此的耦合关系,提高彼此的灵活性。下面为代理模式的简略结构类图:

 

代理模式的角色有三个,分别为:抽象角色、代理角色以及具体角色。具体如下:

抽象角色:声明了代理角色和具体角色的共用接口,促使可以使用具体实角色的地方都可使用代理角色。

具体角色:定义代理角色所要代表的具体角色。

代理角色:包含对具体角色的引用,从而可以在任何时候操作具体角色对象;代理角色提供了与具体角色相同的接口,可以方便在任何时候替代具体角色对象。

 

下面我们举个实际例子进行说明代理的使用。在项目当中,我们要实现一个搜索功能,搜索数据之前,需要先验证用户是否为登录或会员,如果不是会员,那么提示并返回不准即系查询;另外,我们还需要记录会员的搜索记录次数,这样可以帮助运营的后期推广统计哦!当然,这里只是模拟实现,验证失败则提示权限不够,记录的次数显示为搜索的次数(每次搜索记录即可),而最终搜出的结果,直接显示为搜索的关键字(正常不是这样的哦)。

下面为我的搜索功能的详细类图结构关系:

 

 

好了,准备的工作已经好了,接下来请看具体的代码实现,具体如下:

ProSearcher:

public interfaceProSearcher {

  

   /**

    * 声明一个抽象的方法

    */

   StringdoSearch(String userName,Stringpassword,Stringkey);

  

}

 

ProRealSearcher:

public class ProRealSearcher implements ProSearcher {

  

   public ProRealSearcher() {

      super();

   }

 

   /**

    * 真正的查询操作在这里进行

    */

   @Override

   public String doSearch(StringuserName, Stringpassword, 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, Stringpassword, 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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值