代理设计模式——学习篇

Android学习——代理设计模式

定义:为其他对象提供一种代理,以控制对这个对象的访问,分为静态代理和动态代理。

简单说就是让别人帮自己做事。下面使用银行办业务举例

1.静态代理

1.1. 目标接口

/**
 * 银行办理业务 - 目标接口(业务)
 */

public interface IBank {
    /**
     * 申请办卡
     */
    void applyBank();

    /**
     * 挂失
     */
    void lostBank();
}

1.2. 代理对象 - 银行的工作人员

/**
 * 银行办理业务 - 代理对象 - 银行的业务员
 */
public class BankWorker implements IBank{
    private IBank bank;
    /**
     * 持有被代理的对象
     * @param bank
     */
    public BankWorker(IBank bank){
        this.bank = bank;
    }

    @Override
    public void applyBank() {
        System.out.println("开始受理");
        bank.applyBank();
        System.out.println("操作完毕");
    }

    @Override
    public void lostBank() {
        System.out.println("开始受理");
        bank.lostBank();
        System.out.println("操作完毕");
    }
}

1.3. 被代理的对象 - 我

/**
 * 银行办理业务 - 被代理的对象 - 我们
 */
public class Man implements IBank{
    private String name;

    public Man(String name){
        this.name = name;
    }

    /**
     * 自己的一些操作
     */
    @Override
    public void applyBank() {
        System.out.println(name + " 申请办卡");
    }

    @Override
    public void lostBank() {
        System.out.println(name + " 申请挂失");
    }
}

1.4 使用

public static void main(String[] args){
    Man man = new Man("jenny");
    BankWorker bankWorker = new BankWorker(man);
    bankWorker.applyBank();
}
2.动态代理

Java 给我们提供了一套动态代理的机制

/**
 * 银行办理业务 - 目标接口(业务)
 */

public interface IBank {
    /**
     * 申请办卡
     */
    void applyBank();

    /**
     * 挂失
     */
    void lostBank();

    /**
     * 额外业务
     */
    void extraBank();
}
/**
 * 银行办理业务 - 被代理的对象 - 我们
 */
public class Man implements IBank {
    private String name;

    public Man(String name){
        this.name = name;
    }

    /**
     * 自己的一些操作
     */
    @Override
    public void applyBank() {
        System.out.println(name + " 申请办卡");
    }

    @Override
    public void lostBank() {
        System.out.println(name + " 申请挂失");
    }

    @Override
    public void extraBank() {
        System.out.println(name + " 额外业务");
    }
}
/**
 * 银行办理业务 - 动态代理 - InvocationHandler
 */

public class BankInvocationHandler implements InvocationHandler{
    /**
     * 被代理的对象
     */
    private Object mObject;

    public BankInvocationHandler(Object object){
        this.mObject = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行方法 ,目标接口调用的方法都会来到这里面

        System.out.println("开始受理");
        // 调用被代理对象的方法,这里其实调用的就是  man 里面的 applyBank 方法
        Object voidObject = method.invoke(mObject,args);
        System.out.println("操作完毕");
        return voidObject;
    }
}
public static void main(String[] args) {
    Man man = new Man("jenny");

    IBank bank =
            // 返回的是 IBank 的一个实例对象,这个对象是由 Java 给我们创建的 ,调用的是 jni
            (IBank) Proxy.newProxyInstance(
                    IBank.class.getClassLoader(), // ClassLoader
                    new Class<?>[]{IBank.class}, // 目标接口
                    new BankInvocationHandler(man) // InvocationHandler (这个类是关键)
            );
    // 当调用这个方法的时候会来到 BankInvocationHandler 的 invoke 方法
    bank.applyBank();

    bank.lostBank();

    bank.extraBank();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值