<强>本文源码强>:GitHub·点这里| | GitEE·点这里
一、生活场景
1场景描述
在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个快递的代收点,比如快递柜,快递驿站等,然后等有时间的时候再过去取,下面使用代码对这个场景进行简单的描述。
引用>2场景图解
3,源码实现
<代码>公共类C01_InScene { 公共静态void main (String [] args) {/*自己收快递的测试方式*/GetExpress GetExpress=new GetExpress (); getExpress.sureInfo (); getExpress.signName(“张三”);/*代收快递的测试方式*/ExpressAct getUser=new GetExpress (); ExpressAct getProxy=new ProxyExpress (getUser); getProxy.sureInfo (); getProxy.signName(“李四”); } }/* * *接收一个快递的动作接口:确认信息,签名 */接口ExpressAct { 空白sureInfo (); 空白signName(字符串名称); }/* * *定义一个类接收快递:自己去拿快递 */类GetExpress实现ExpressAct { @Override 公共空间sureInfo () { System.out.println(“请确认你的个人信息!”); } @Override 公共空间signName(字符串名称){ System.out.println(“你的名字是:“+名字); } }/* * *定义一个类接收快递:找人代领快递 */类ProxyExpress实现ExpressAct { 私人ExpressAct ExpressAct=零; 公共ProxyExpress (ExpressAct ExpressAct) { 这一点。expressAct=expressAct; } @Override 公共空间sureInfo () { this.expressAct.sureInfo (); } @Override 公共空间signName(字符串名称){ this.expressAct.signName(名称); } }代码>二、代理模式
1,概念描述
代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,就是一个对象代表另一个对象执行相应的动作程序。而代理对象可以在客户端和目标对象之间起到中介的作用。
引用>2,模式图解
3,核心角色
<李>抽象对象角色李>
声明目标对象和代理对象的共同接口。
引用><李>目标对象角色李>
定义了代理对象所代表的目标对象。
引用><李>代理对象角色李>
代理对象内部含有目标对象的引用,可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象,AOP编程就是基于这个思想。
引用>4,源码实现
<代码>公共类C02_Proxy { 公共静态void main (String [] args) { AbstractObject对象=new ProxyObject (); object.operation (); } }/* * *抽象对象角色 */抽象类AbstractObject { 公共抽象空操作(); }/* * *目标对象角色 */类TargetObject延伸AbstractObject { @Override 公共空间操作(){ system . out。println(“目标方法运行…”); } }/* * *代理对象角色 */类ProxyObject延伸AbstractObject { TargetObject TargetObject=new TargetObject (); @Override 公共空间操作(){ system . out。println(“方法之前…”); targetObject.operation (); system . out。println(“后方法…”); } }代码>三,JDK动态代理
基于JDK动态代理方式实现AOP切面编程。
1,代码实现
<代码>公共类C03_JdkProxy { 公共静态void main (String [] args) { BookService BookService=BookAopProxyFactory.createService (); System.out.println (bookService.getBook ()); } } 类BookAspect { 公共空间在(){ system . out。println(“方法之前…”); } 公共空间后(){ system . out。println(“后方法…”); } } 接口BookService { 字符串getBook (); } 类BookServiceImpl实现BookService { @Override 公共字符串getBook () { System.out.println(“目标方法【getBook】被执行”); 返回“高性能MySQL”; } } 类BookAopProxyFactory { 公共静态BookService createService () {//目标类 最后BookService BookService=new BookServiceImpl ();//切面类 最后BookAspect BookAspect=new BookAspect ();/* *代理类:将目标类(切入点)和切面类(通知)结合 */BookService proxyBookService=(BookService) Proxy.newProxyInstance ( BookAopProxyFactory.class.getClassLoader (), .getInterfaces bookService.getClass () (), 新的InvocationHandler () { 公共对象调用对象代理、方法方法, {Object [] args)抛出Throwable//前执行 bookAspect.before ();//执行目标类的方法 对象obj=方法。调用(bookService, args);//后执行 bookAspect.after (); 返回obj; } }); 返回proxyBookService; } }Java描述设计模式(16):代理模式