代理模式
来源:互联网 发布:编程求解汉诺塔问题 编辑:程序博客网 时间:2024/06/05 03:40
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式:
人如其名,代理相信大家都可以经常看到什么什么代理,现实中代理太多了。感受最真实的是火车票的代理,经常可以在街上看到,你买票的是在代理商买的,但是付的钱依然会交给铁大哥,这就是代理。现实中的你可能会接触的例子就是叫同学去给你买票,实际上不是你去买,但是是票是你的。这也是代理。
代理模式组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理的UML图
代理的优点:
(1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。叫你去买票,我管你有没有摔跤撒的,不需要关注这种问题。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。别人在路上一看,以为是你同学要买票去哪里,实际上买的是你的,保护了你。
(3).高扩展性 只要符合火车站规定的人,同学都可以去代人买票。
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Proxy { public static void main(String[] args) { ProxyRole proxyRole=new ProxyRole(new XiaoA()); proxyRole.buyTicket(); PersonTest personTest=new XiaoA(); DynamicProxy dynamicProxy=new DynamicProxy(personTest); PersonTest proxy= (PersonTest) dynamicProxy.getProxy(); proxy.buyTicket(); }}interface PersonTest{ void buyTicket();}class XiaoA implements PersonTest{ @Override public void buyTicket() { System.out.println("买票"); }}class ProxyRole implements PersonTest{ private PersonTest personTest; //默认代理小A public ProxyRole() { this.personTest=new XiaoA(); } //也可以代理其他子类 public ProxyRole(PersonTest personTest) { this.personTest=personTest; } @Override public void buyTicket() { personTest.buyTicket(); }}//使用JDK的动态代理//实现自己的InvocationHandlerclass DynamicProxy implements InvocationHandler{ //目标对象 private Object object; public DynamicProxy(Object object) { this.object = object; } //执行目标对象的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //before Object result = method.invoke(object, args); //after return result; } public Object getProxy(){ return java.lang.reflect.Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),this.object.getClass().getInterfaces(),this); }}
JDK动态代理原理请看:http://rejoy.iteye.com/blog/1627405
阅读全文