赞
踩
代理模式是一种
结构型设计模式
,可以允许通过代理对象控制对其他对象的访问,代理对象充当了目标对象的中介,客户端通过代理对象访问目标对象,能够实现在不改变目标对象的前提之下,控制或者拓展对象的行为
。
代理模式细分可以划分为如下三种:
调用真实类的方法进行实际的操作
。下面给出静态代理
的实现代码:
public interface ISubject { void request(); } public class RealSubject implements ISubject { @Override public void request() { System.out.println("RealSubject: Handling request."); } } public class Proxy implements ISubject { private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { System.out.println("Proxy: Logging before requesting."); realSubject.request(); System.out.println("Proxy: Logging after requesting."); } } // 在使用时,我们可以这样调用: RealSubject realSubject = new RealSubject(); Proxy proxy = new Proxy(realSubject); proxy.request();
在代码中,定义了一个ISubject
接口,一个RealSubject
类,实现了接口;然后定义了一个Proxy
类,实现了ISubject
接口,并且在实现request
方法,先输出日志,然后调用RealSubject
的request方法,最后在输出日志,能够实现在不改变原始类的情况下,添加额外的功能。
innovationHandler
接口,以及一个Proxy
类生成对象。静态代理
在Android中使用代理模式时,静态代理是最简单的实现方式之一。给出代码演示了如何使用静态代理来实现权限控制:
首先,定义一个接口IUserManager
,它将被代理类和真实类实现:
public interface IUserManager {
void addUser(String name, String password);
}
然后,定义一个真实类UserManager
,它实现了IUserManager
接口:
public class UserManager implements IUserManager {
@Override
public void addUser(String name, String password) {
// 添加用户的业务逻辑
}
}
接下来,定义一个代理类UserProxy
,它也实现了IUserManager
接口,并且包含一个真实类UserManager
的实例:
public class UserProxy implements IUserManager { private IUserManager userManager; public UserProxy(IUserManager userManager) { this.userManager = userManager; } @Override public void addUser(String name, String password) { // 在添加用户之前,进行权限校验 if (checkPermission()) { userManager.addUser(name, password); } else { throw new RuntimeException("无权限进行该操作"); } } private boolean checkPermission() { // 校验用户权限的业务逻辑 return true; } }
在这个代理类中,实现了addUser
方法并在其中进行了权限校验。如果校验通过,则调用真实类UserManager
的addUser
方法,否则抛出一个运行时异常。
最后,在使用时,可以这样来创建代理对象并调用其方法:
IUserManager userManager = new UserManager();
IUserManager userProxy = new UserProxy(userManager);
userProxy.addUser("MAC", "XXXXXXX");
首先创建了一个真实类的实例UserManager
,然后使用它来创建一个代理对象UserProxy
。通过代理对象来调用addUser
方法。在执行这个方法时,代理对象会先进行权限校验,然后再调用真实对象的addUser
方法来实际添加用户。
动态代理
在Android开发中,动态代理通常使用Java的反射机制
来实现。给出下面的代码展示如何利用动态代理。
首先,定义一个接口IUserManager
,它将被代理类和真实类实现:
public interface IUserManager {
void addUser(String name, String password);
}
然后,定义一个真实类UserManager
,它实现了IUserManager
接口:
public class UserManager implements IUserManager {
@Override
public void addUser(String name, String password) {
// 添加用户的业务逻辑
}
}
接下来,定义一个PermissionHandler
类,它实现了InvocationHandler
接口,并包含一个真实类UserManager
的实例:
public class PermissionHandler implements InvocationHandler { private IUserManager userManager; public PermissionHandler(IUserManager userManager) { this.userManager = userManager; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在调用方法之前,进行权限校验 if (checkPermission()) { return method.invoke(userManager, args); } else { throw new RuntimeException("无权限进行该操作"); } } private boolean checkPermission() { // 校验用户权限的业务逻辑 return true; } }
在这个类中,实现了invoke
方法,并在其中进行了权限校验。如果校验通过,则调用真实类UserManager
的相应方法,否则抛出一个运行时异常。
最后,在使用时,我们可以这样来创建代理对象并调用其方法:
IUserManager userManager = new UserManager();
PermissionHandler handler = new PermissionHandler(userManager);
IUserManager userProxy = (IUserManager) Proxy.newProxyInstance(userManager.getClass().getClassLoader(),
new Class[]{IUserManager.class}, handler);
userProxy.addUser("Tom", "123456");
创建了一个真实类的实例UserManager
,然后使用它来创建一个PermissionHandler
对象。使用Proxy
类的静态方法newProxyInstance
来创建代理对象userProxy
。在创建代理对象时指定真实类的类加载器和实现的接口,以及PermissionHandler
对象作为代理对象的处理器;通过代理对象来调用addUser
方法。在执行这个方法时,代理对象会先进行权限校验,然后再调用真实对象的addUser
方法来实际添加用户。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。