设计模式:代理模式

代理模式定义

为其他对象提供一种代理以控制这个对象的访问。

1、静态代理

静态代理很好理解就是我们需要编写一个代理类。实现我们需要代理的所有方法。所以称之为静态代理。由于需要代理的方法可能有很多。为了约束代理类和被代理类这些相同的方法,所以写一个接口来继承是最直观的方式,当然这个接口不是必须的,可加可不加。都不影响,主要是理解代理这个设计模式的思想。代理模式的变化也很多。

public interface ProxyInterface {
    void choiceBetterHouse(); //模拟挑选优质房子
    void buyHouse(); //模拟买房子
}

然后我们定义一个叫Petter的人

public class Petter implements ProxyInterface {
    private static final String TAG = Petter.class.getSimpleName();

    @Override
    public void choiceBetterHouse() {
        Log.d(TAG,"挑选优质房子");
    }

    @Override
    public void buyHouse() {
        Log.d(TAG,"买房子");
    }
}

然后定义代理类

public class StaticProxy implements ProxyInterface {
    private Petter petter;

    public StaticProxy(Petter petter) {
        this.petter = petter;
    }

    @Override
    public void choiceBetterHouse() {
        petter.choiceBetterHouse();
    }

    @Override
    public void buyHouse() {
        petter.buyHouse();
    }
}

然后就是调用

        Petter petter = new Petter();
        StaticProxy agency = new StaticProxy(petter);
        agency.choiceBetterHouse();
        agency.buyHouse();

2、动态代理

动态代理和静态代理的区别就是动态代理不用我们去手动编写代理类。动态代理就是JDK提供的机制,可在内存中动态的生成代理类。
例子还是上面的例子,我们重新编写动态代理类

public class DynamicProxy implements InvocationHandler {
    private static final String TAG = DynamicProxy.class.getSimpleName();
    private Object object;

    public DynamicProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Log.d(TAG,"invoke");
        Object result = method.invoke(object,args);
        return result;
    }
}

动态代理的核心就是继承InvocationHandler这个接口,通过method的invoke方法来间接调用原本的方法。这里和java反射调用方法的时候一样。
然后我们看客户端是如何调用的

Petter petter = new Petter();
        // 返回一个代理对象
        ProxyInterface proxyPetter = (ProxyInterface) Proxy.newProxyInstance(
                petter.getClass().getClassLoader(),
                petter.getClass().getInterfaces(),
                new DynamicProxy(petter));
        proxyPetter.choiceBetterHouse();
        proxyPetter.buyHouse();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值