设计模式——代理模式
2017-05-03 11:38
246 查看
代理模式的作用是控制和管理訪问
转载请说明出处:http://blog.csdn.net/dawanganban
先看一段代码:
package com.test; /** * 抽象角色 * @author Administrator * */ abstract public class Subject { abstract public void request(); }
package com.test; /** * 真实角色 * @author 阳光小强 * */ public class RealSubject extends Subject{ public RealSubject(){ } public void request(){ System.out.println("From real subject"); } }
package com.test; /** * client调用 * @author 阳光小强 * */ public class Main { public static void main(String[] args) { Subject sub = new RealSubject(); sub.request(); } }上面代码应该非常easy看懂。以下我们使用代理模式(新增一个ProxySubject类)
package com.test; /** * * @author 阳光小强 * */ public class ProxySubject extends Subject{ private RealSubject realSubject; //以真实角色作为代理角色的属性 public ProxySubject(){ } @Override public void request() { preRequest(); if(realSubject == null){ realSubject = new RealSubject(); } realSubject.request(); postRequest(); } private void preRequest(){ //something you want to do before requesting } private void postRequest(){ //something you want to do after requesting } }
客户实际须要调用的是RealSubject类的request()方法,如今用ProxySubject来代理RealSubject类。相同达到目的。同一时候还封装了其它方法(preRequest(),postRequest())。能够处理一些其它问题。
有时候我们须要代理的对象不确定,所以就须要动态代理,Java中的动态代理模式实现例如以下:
package com.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicSubject implements InvocationHandler { private Object dele; public DynamicSubject(Object obj) { this.dele = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { doBefore(); //在这里全然能够把以下这句凝视掉。而做一些其它的事情 Object result = method.invoke(dele, args); after(); return result; } private void doBefore() { System.out.println("before...."); } private void after() { System.out.println("after...."); } }
package com.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * client调用 * @author 阳光小强 * */ public class Main { public static void main(String[] args) throws Exception { RealSubject rs = new RealSubject(); //被代理的类 InvocationHandler ds = new DynamicSubject(rs); //初始化代理类 Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds); subject.request(); } }
相关文章推荐
- 设计模式----Proxy(代理)模式
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
- 设计模式 --- 代理模式(Proxy) 精选经验合集
- 深入浅出基于Java的代理设计模式
- 设计模式之Proxy(代理)
- 设计模式与泡mm的关系之Proxy代理模式及代理模式的再思考
- 设计模式(6)-代理模式(Proxy)
- Java设计模式:Proxy(代理)
- 设计模式之Proxy(代理)
- 深入浅出基于Java的代理设计模式
- 设计模式——代理模式
- 设计模式之代理模式(Proxy)
- C#中利用代理实现观察者设计模式
- 设计模式之Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式(8)-代理模式(Proxy)