java设计模式:代理模式
来源:互联网 发布:java图形接口 编辑:程序博客网 时间:2024/06/07 05:09
package com.selfStudy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/*本文来学习代理设计模式: * 代理模式:它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象;充当着中间人 * 的角色;(就想公司里老板和秘书的关系); * 组成元素: * 1.抽象角色:声明真实对象和代理对象的共同接口; * 2.真实角色:代理角色所代表的真实对象,是我们最终要引用的对象; * 3.代理角色:其内部通过构造器拿到实际对象的引用,同时代理对象与真实的对象实现相同的接口,以便 * 在任何是否都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作; * 相当于对真实对象进行了封装; * * * *///1.抽象角色interface Subject{ void doSomething(String args); void doSomething();}//2.真实对象class RealSubject implements Subject{ public void doSomething(){ System.out.println(" RealSubject dosothming"); } public void doSomething(String args) { System.out.println("i will sumbit this "+args+" to our Web service"); } }//3.代理角色class ProxySubject implements Subject{ private Subject real=null; ProxySubject(Subject real){ this.real = real; } @Override public void doSomething(String args) { System.out.println("frist , examine the network"); real.doSomething(args); } @Override public void doSomething() { System.out.println("proxySubject dosomething"); real.doSomething(); }}/* * 上述代码客服端实际上是想调用的是RealSubject 的doSomething方法,可以看到通过代理模式,其不但执行了RealSubject的doSomething * 方法,还执行了一些额外的操作; * 上面模式的缺点: * 首先:真实角色必须事先已经存在,并且其作为代理角色的内部属性; * 其次:一个真实的角色必须对应一个代理角色,那么就会存在这样的问题,如果存在大量的真实角色,那岂不会存在大量的代理角色 * 从而使类数量急剧膨胀; * 因此引入动态代理模式: * 此时就会用到了java反射包中的 InvocationHandler接口和Proxy类; * */class DynamicProxy implements InvocationHandler{ private Object proxied; public DynamicProxy(Object proxied){ this.proxied = proxied; } /** * Object proxy:在其上调用方法的代理实例 * Method method:对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口 * ,该接口可以是代理类赖以继承方法的代理接口的超接口。 * Object[] args:包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数 * 被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(args!=null) return method.invoke(proxied, args); return method.invoke(proxied); }}/** * ClassLoader: loader - 定义代理类的类加载器 * Class[] :interfaces - 代理类要实现的接口列表 * InvocationHandler:h - 指派方法调用的调用处理程序 */public class ProxyModel { public static void main(String[] args) { ProxySubject ps = new ProxySubject(new RealSubject()); ps.doSomething(); ps.doSomething("seek people"); RealSubject real = new RealSubject(); Subject proxy = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class},new DynamicProxy(real)); proxy.doSomething("hahahah"); }}
0 0
- java设计模式-代理模式
- Java设计模式-----代理模式
- java设计模式-代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- Java设计模式-代理模式
- Java 设计模式 代理模式
- Java设计模式-代理模式
- java设计模式-代理模式
- Java设计模式:代理模式
- java设计模式-----代理模式
- java 设计模式-代理模式
- java设计模式:代理模式
- java设计模式---代理模式
- java设计模式--代理模式
- java设计模式--代理模式
- java设计模式:代理模式
- 动态规划交错匹配问题
- 网络层概念学习之一(基本概念、路由器、选路算法)
- Arm Inline hook的简易原理图
- ACE框架整合记录5tooltip插件-【完结】
- iOS设备唯一标识探讨
- java设计模式:代理模式
- Winform NetAdvantage的Summary相关功能(一)
- 新闻类list,支持两种不同的item
- cocos2dx3.x 导出自定义事件到lua的方法
- Android-微信支付简单教程
- nohup linux 运行不了
- 排序——归并排序
- 网易视频云:新一代列式存储格式Parquet
- ACE框架整合记录6菜单权限列表样式效果