到网上找这个模式的例子,不知为何,突然觉得这个和之前写的装饰器模式特别像
感觉都做了一件:方法增强!
代理模式:为其他对象提供一种代理以控制对这个对象的访问.
这里要理解【控制】为何物,又是如何做到控制的。
代理模式有以下角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
Example:用代理实现一个场景,十二运召开了,一票难求,不得已,有许多代理售票点。
用代理模式实现【这个例子合适吗 ?】
1. 抽象角色
/** * 抽象角色 : 售票窗接口 * * @author king * */ public interface IWicket { //主要功能是售票 void sell(); }
2.真实角色
/** * 真实角色:售票窗 * * @author king */ public class Wicket implements IWicket{ @Override public void sell() { System.out.println("给一张十二运的票...."); } }
3.代理角色
/** * * 代理角色 * * @author king * */ public class ProxyWicket implements IWicket { private IWicket wicket; /** * 代理类调用被代理类的方法 */ @Override public void sell() { if(null == wicket){ wicket = new Wicket();//被代理的对象 } System.out.println("HY来到代理点买十二运人的票"); wicket.sell(); } }
4. 运行类
public class Main { public static void main(String[] args) { //没被代理之前 IWicket wicket = new Wicket(); System.out.println("去窗口买票....."); wicket.sell(); System.out.println("----------------------"); //被代理之后 System.out.println("去代理点买票....."); IWicket proxywicket = new ProxyWicket(); proxywicket.sell(); } }
运行结果:
去窗口买票.....
给一张十二运的票....
----------------------
去代理点买票.....
HY来到代理点买十二运人的票
给一张十二运的票....
想到了什么,java的动态代理是不是?
JDK动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
example:先实现一个登陆校验功能,但是当它被代理的时候,在校验的前后要插入日志
1.业务逻辑接口
/** * 业务逻辑接口 * * @author king * */ public interface ILoginService { //对应的业务方法 void login(); }
2. 实现类
/** * 实现类 * * @author king * */ public class LoginService implements ILoginService{ //验证用户名,实现登陆功能 @Override public void login() { System.out.println("校验用户名和密码..."); } }
3..日志方法
/** * * 日志类 * * @author king * */ public class LogUtil { //方法被执行之前调用 public static void before(String method){ System.out.println("before call: "+ method); } //方法被执行后调用 public static void after(String method){ System.out.println("after call: "+method); } }
4.动态代理类
/** * 动态代理,实现日志插入功能 * * @author king * */ public class ProxyService implements InvocationHandler { private Object target;//定义一个代理的目标类 public ProxyService(Object target) { this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法执行前 LogUtil.before(target.getClass().getName()+"."+method.getName()); Object obj = method.invoke(target, args); //方法执行后 LogUtil.before(target.getClass().getName()+"."+method.getName()); return obj; } }
5. 运行类:
public class Main { public static void main(String[] args) { ILoginService target = new LoginService(); ProxyService handler = new ProxyService(target); ILoginService proxy = (ILoginService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), handler); proxy.login(); } }
运行结果:
before call: designpattern.jdk.proxy.LoginService.login
校验用户名和密码...
before call: designpattern.jdk.proxy.LoginService.login
本人菜鸟HY大神的一阳神指
参考文档 <http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924> ,此处致谢
相关推荐
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...
动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf
设计模式之代理模式 学习
JAVA设计模式之代理模式实例
.net实现设计模式之代理模式
31.设计模式之代理模式 32.设计模式之观察者模式 33.设计模式之策略模式 34.设计模式之命令模式 35.设计模式之迭代器模式 36.设计模式之中介者模式 37.设计模式之享元模式 38.设计模式之职责链模式 39.设计模式之...
设计模式 代理模式 c#
文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
面向对象23种设计模式之代理模式,简单明了。面向对象23种设计模式之代理模式,简单明了。
代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18....
C#设计模式 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 4.单例模式 5.建造者模式 6.原型模式 7.适配器模式 8.装饰器模式 9.代理模式 10.外观模式 11.桥接模式