代理模式
来源:互联网 发布:图形旋转矩阵 编辑:程序博客网 时间: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();}
静态代理总结:
可以做到在不修改目标对象功能前提下,对目标功能扩展。不足的是因为代理对象需要与目标实现一样的接口,所以会有很多代理类,类太多。同时一旦接口增加方法,目标对象与代理对象都需要维护。
与静态代理相对应,不需要实现接口。利用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();}
阅读全文
2 0
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- Redis使用守护进程启动sentinel并指定其日志目录
- mysql表结构导出成Excel格式带备注
- Linux 基础命令 及 jdk,mysql,tomcat的安装
- Gson解析JSON中动态未知字段key的方法
- Oracle SQL谓词推进、视图合并
- 代理模式
- 编译hadoop2.8.0
- 深入理解RESTful
- 了解Mysql分区
- 正则表达式
- 完成端口IOCP详解
- C++日志库_spdlog
- Python 学习 第二天
- ajax中post方法传参数,会丢失&,%,+',要转义