代理模式

来源:互联网 发布:图形旋转矩阵 编辑:程序博客网 时间:2024/06/11 16:49

代理模式示例


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

示例:
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不支持这种代理方式。大家可以去百度一下。

原创粉丝点击