Android开发设计模式之代理模式实现思路

10 篇文章 0 订阅
6 篇文章 0 订阅

代理模式是一种结构型设计模式,可以允许通过代理对象控制对其他对象的访问,代理对象充当了目标对象的中介,客户端通过代理对象访问目标对象,能够实现在不改变目标对象的前提之下,控制或者拓展对象的行为


代理模式

代理模式细分可以划分为如下三种:

  • 静态代理:这是最简单的代理模式,要求代理类和真实类实现相同的接口,并且代理类中只包含了一个真实类的实例。客户端代码通过调用代理类的方法时,代理类会对其进行一些处理,然后调用真实类的方法进行实际的操作

下面给出静态代理的实现代码:

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方法,最后在输出日志,能够实现在不改变原始类的情况下,添加额外的功能。

  • 动态代理:这是一种更为灵活的代理模式,不要求代理类或者真实类实现同样的接口,而是利用java的反射机制实现运行时动态生成代理对象,动态代理通常涉及到一个innovationHandler接口,以及一个Proxy类生成对象。

Android开发中使用静态代理

在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方法并在其中进行了权限校验。如果校验通过,则调用真实类UserManageraddUser方法,否则抛出一个运行时异常。

最后,在使用时,可以这样来创建代理对象并调用其方法:

IUserManager userManager = new UserManager();
IUserManager userProxy = new UserProxy(userManager);
userProxy.addUser("MAC", "XXXXXXX");

首先创建了一个真实类的实例UserManager,然后使用它来创建一个代理对象UserProxy。通过代理对象来调用addUser方法。在执行这个方法时,代理对象会先进行权限校验,然后再调用真实对象的addUser方法来实际添加用户。


Android开发中使用动态代理

在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方法来实际添加用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值