代理模式

代理模式示例


       先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者补鞥呢直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
       
      代理模式的组成:
      抽象目标:通过接口或者抽象声明真实角色实现的业务方法。
      代理角色:实现抽象目标,是真实目标的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
      真实目标:实现抽象角色,定义真实目标所要实现的业务逻辑,供代理角色调用。

示例:
1、静态代理
抽象目标
public interface ISendBroadcast {
    void send();
}

代理
public class SendBroadcastProxy implements ISendBroadcast {

    private static final String TAG = SendBroadcastProxy.class.getSimpleName();
    private ISendBroadcast target;

    public SendBroadcastProxy(ISendBroadcast target) {
        this.target = target;
    }

    @Override
    public void send() {
        Log.e(TAG, "send:静态 准备发送");
        target.send();
        Log.e(TAG, "send:静态 发送广播成功" );
    }
}

目标对象
public class SendBroadcast implements ISendBroadcast {
    private static final String TAG = SendBroadcast.class.getSimpleName();

    @Override
    public void send() {
        Log.e(TAG, "send: 使用代理发送广播" );
    }
}

客户端
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toast.makeText(this, "静态代理", Toast.LENGTH_SHORT).show();
    Log.e(TAG, "staticProxy: 静态代理" );
    SendBroadcast broadcast = new SendBroadcast();
    SendBroadcastProxy broadcastProxy = new SendBroadcastProxy(broadcast);
    broadcastProxy.send();
}

静态代理总结:
       可以做到在不修改目标对象功能前提下,对目标功能扩展。不足的是因为代理对象需要与目标实现一样的接口,所以会有很多代理类,类太多。同时一旦接口增加方法,目标对象与代理对象都需要维护。


2、动态代理
      与静态代理相对应,不需要实现接口。利用JDK的API动态的在内存中构建代理对象。所以动态代理也叫作JDK代理,接口代理。

代理
public class ProxyFactory {

    private static final String TAG = ProxyFactory.class.getSimpleName();
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Log.e(TAG, "invoke:动态 准备发送");
                        Object invoke = method.invoke(target, args);
                        Log.e(TAG, "invoke:动态 发送广播成功");
                        return invoke;
                    }
                }
        );
    }
}

客户端
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toast.makeText(this, "动态代理", Toast.LENGTH_SHORT).show();
    Log.e(TAG, "dynamicProxy: 动态代理" );
    SendBroadcast broadcast = new SendBroadcast();
    ISendBroadcast instance = (ISendBroadcast) new ProxyFactory(broadcast).getProxyInstance();
    Log.e(TAG, "onCreate: 999" + instance.getClass());
    instance.send();
}

java还可以使用Cglib代理,但是android不支持这种代理方式。大家可以去百度一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值