代理模式
来源:互联网 发布:华软市政软件 编辑:程序博客网 时间:2024/04/29 12:01
代理模式是在不改变源码的情况下增加已有方法的功能。要使用代理模式的前提是:被代理的类实现了一个接口。代理模式分为静态代理模式与动态代理模式。
静态代理模式:
只是在实现与被代理类相同的接口,在代理对象力穿一个被代理类的对象。具体实现如下代码:
class ProxyList implements List<String>{List<String> target;public ProxyList(List<String> target) {this.target = target;}@Overridepublic boolean add(String e) {Thread t = Thread.currentThread();System.out.println("线程"+t.getName()+"调用add"); return target.add(e); }@Overridepublic void add(int index, String element) {// TODO Auto-generated method stub}@Overridepublic boolean addAll(Collection<? extends String> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean addAll(int index, Collection<? extends String> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic void clear() {// TODO Auto-generated method stub}@Overridepublic boolean contains(Object o) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean containsAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic String get(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic int indexOf(Object o) {// TODO Auto-generated method stubreturn 0;}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn false;}@Overridepublic Iterator<String> iterator() {// TODO Auto-generated method stubreturn null;}@Overridepublic int lastIndexOf(Object o) {// TODO Auto-generated method stubreturn 0;}@Overridepublic ListIterator<String> listIterator() {// TODO Auto-generated method stubreturn null;}@Overridepublic ListIterator<String> listIterator(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean remove(Object o) {// TODO Auto-generated method stubreturn false;}@Overridepublic String remove(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean removeAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean retainAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic String set(int index, String element) {// TODO Auto-generated method stubreturn null;}@Overridepublic int size() {// TODO Auto-generated method stubreturn 0;}@Overridepublic List<String> subList(int fromIndex, int toIndex) {// TODO Auto-generated method stubreturn null;}@Overridepublic Object[] toArray() {// TODO Auto-generated method stubreturn null;}@Overridepublic <T> T[] toArray(T[] a) {// TODO Auto-generated method stubreturn null;}}
上面的代码是list集合的一个静态代理类,在这个类力只是实现了一个add方法,其他方法只要增加一定的功能和调用target对象相应的方法就可以。
动态代理:
java 提供了动态代理API:
1 底层是利用反射实现的功能
2 java 提供了API Proxy,动态的继承接口(被代理类所实现的接口),实现接口中所有的方法,当方法被调用时候,将调用请求转给调用处理器处理
3 调用处理器,就可以处理所有的方法执行过程
下面代码是list集合的动态代理的实现以及与之的实现:
public List proxy(final List list){//调用处理器InvocationHandler handler = new InvocationHandler() {//invoke 调用//当有方法被调用时候执行invoke 方法,// 参数proxy是代理对象, method正在执行的方法, args是调用方法传递的参数// 返回值是方法执行的结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Thread t = Thread.currentThread();System.out.println("线程"+t.getName()+"调用"+method.getName());//根据业务规则决定是否执行 被代理方法 method.invoke(list, args);//在这里可以添加业务逻辑//if(没有授权) throw 权限不够异常//if(没有登陆) throw 需要登陆异常//方法调用之前的 可以添加逻辑Object val = method.invoke(list, args);//方法调用之后的 可以添加逻辑// 返回值太大 超过范围,抛出权限不够 。。。return val;}};/* * 创建代理类对象 * Proxy.newProxyInstance 根据接口 getClass.getClassLoader:获取一个类加载器(任何一个类加载器都可以), * new Class[]{List.class}:必须是接口 , handler :将一个处理器传给代理类,以便在代理类中调用handler中的invoke方法。 * List.class 创建对象,也就是实现了接口的全部方法 * 当调用了这些方法时候,就会执行 调用处理器中的 invoke方法,并且当前方法作为参数 method * 传递给 invoke 方法,在invoke方法可以利用 method.invoke()执行方法。 */List proxy = (List) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{List.class}, handler);return proxy;}}
测试代理类对象的方法:
public void testProxy3(){List<String> list = new ArrayList<String>();list = proxy(list);list.add("Tom");list.add("Jerry");list.remove("Tom");}
代理模式的图片分析:
0 0
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- poj 1020 Anniversary Cake dfs的灵活结构
- 虚拟工作室tfs版添加用户
- URAL1353---Milliard Vasya's Function(简单数位dp)
- 自己写的剪切文件代码
- Remove Linked List Elements
- 代理模式
- Orcale 常用命令集合 (更新中)
- [LeetCode]Repeated DNA Sequences
- 序列化和反序列化xml文档
- Share Your Music - HTML5 Music Web App
- Android Studio
- 黑马程序员-面向对象和面向过程-学习笔记
- java多线程问题中简单的存取款实现
- 《算法导论》9、三个线性时间排序(C++)