首页 > 编程知识 正文

代理模式有几种,静态代理和动态代理

时间:2023-05-06 01:16:34 阅读:26142 作者:2440

1 .什么是代理模式? 代理:不要自己做,找个人做。

代理模式:向现有功能添加新功能。

分类:静态代理和动态代理。

2 .静态代理2.1传统方式: publicclassteamservice ({ public void add () try ) system.out.println ),其中核心业务和服务方法写在一起)。 //核心业务system.out.println (' team service---- add---- ' ); System.out.println ('提交事务); }catch(exceptione ) { e.printStackTrace ); System.out.println (回滚事务); } } } 2.2基于类的静态代理隔离服务代码,核心业务存储业务只有存储功能

publicclassteamservice (public void add ) ) system.out.println (' team service---- add---' ); //核心业务} }核心业务由被代理进行的其他服务功能由代理类进行

publicclassproxyteamserviceextendsteamservice { public void add (} { try } system.out.println ) '事务启动'); super.add (; System.out.println ('提交事务); }catch(exceptione ) ({ System.out.println ) (“回滚事务”); } }} 弊端:代理类只能代理一个类

2.3基于接口的静态代理为核心业务(保存的add )创建接口并通过接口暴露被代理的方法

要求: http://www.Sina.com/http://www.Sina.com /

publicinterfaceiservice { void add (; } publicclassteamserviceimplementsiservice { @ overridepublicvoidadd (} system.out.println (team service---add//核心业务) publicclassuserserviceimplementsiservice { @ overridepublicvoidadd (} { system.out.println (userservice--//核心业务} )

事务代理类:

publicclassproxytranserviceimplementsiservice {私有服务服务; //代理对象的publicproxytranservice (iserviceservice ) { this.service=service; } @Override public void add (() try ) system.out.println (“事务启动”); 服务. add (; //核心业务由被代理进行的其他服务功能是代理类为System.out.println (“提交事务”); }catch(exceptione ) ({ System.out.println ) (“回滚事务”); }}日志代理类:

publicclassproxylogserviceimplementsiservice {私有服务服务; //被代理publicproxylogservice (iserviceservice ) { this.service=service; } @Override public void add () try ) system.out.println ) '开始日志); 服务. add (; /

/核心业务就是由被代理对象完成 ;其他服务功能由代理类完成 System.out.println("结束日志"); }catch (Exception e){ System.out.println("异常日志"); } } }

测试类:

public static void main(String[] args) { TeamService teamService=new TeamService();//被代理对象 UserService userService=new UserService();//被代理对象 ProxyTranService tranService=new ProxyTranService(userService); //事务代理 对象--一级代理 //tranService.add();//代理对象干活 ProxyLogService logService=new ProxyLogService(tranService); //日志的代理对 象--二级代理 logService.add(); } 2.4 提取出切面代码,作为AOP接口(优化)

切面:类似于服务性代码,要切入到核心的代码当中
共有4个位置可以将切面代码编织进入核心业务代码中。
切面接口:

public interface AOP { void before(); void after(); void exception(); void myFinally(); }

事务切面类:

public class TranAOP implements AOP { @Override public void before() { System.out.println("事务----before"); } @Override public void after() { System.out.println("事务----after"); } @Override public void exception() { System.out.println("事务----exception"); } @Override public void myFinally() { System.out.println("事务----myFinally"); } }

日志切面类:

public class LogAop implements AOP{ @Override public void before() { System.out.println("日志----before"); } @Override public void after() { System.out.println("日志----after"); } @Override public void exception() { System.out.println("日志----exception"); } @Override public void myFinally() { System.out.println("日志----myFinally"); } }

代理类:

public class ProxyAOPService implements IService { private IService service;//被代理对象 private AOP aop;//要加入切面 public ProxyAOPService(IService service, AOP aop) { this.service = service; this.aop = aop; } @Override public void add() { try { aop.before(); service.add();//被代理对象干活 aop.after(); }catch (Exception e){ aop.exception(); }finally { aop.myFinally(); } }}

测试类:

@Test public void test02(){ IService teamService=new TeamService();//被代理对象--核心内容 AOP logAop=new LogAop();//切面-服务内容 AOP tranAop=new TranAOP(); //代理对象--一级 代理 IService service=new ProxyAOPService(teamService,logAop); //代理对象--二级代理 IService service2=new ProxyAOPService(service,tranAop); service2.add(); } 总结静态代理: 可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。缺点: 因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。
一旦接口增加方法,目标对象与代理对象都要维护。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。