谈谈Java中的代理模式

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了谈谈Java中的代理模式脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

首先来看一下代理模式的定义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口。代理模式是常用的java设计模式。

代理模式能够在不修改码的情况下增强方法,在方法前后增加日志记录,权限管理等功能。

表现形式如下图:
图片描述

在java中,代理模式分成2种:静态代理模式和动态代理模式;今天我们主要讨论的是静态代理。

1 静态代理
静态代理模式满足如下的几个条件:
a.代理对象的类是真实存在的,并非动态生成的。
b.代理对象持有被代理对象的引用
c.代理对象中的方法通过被代理对象的引用调用被代理对象的方法,同时执行代理逻辑。

下面是一个简单的代理模式,相关代码说明已经在注释中给出,不再另外说明

接口类:

/* +V.X java8733 获取更多资源    * 接口  * 代理类和委托类都必须实现该类  */ public interface ISubject {  //处理任务的抽象方法 public void dealTask(String task); }

委托类:

/* +V.X java8733 获取更多资源    * 真实角色(被代理类,委托类)  * 实现接口Isubject  */ public class RealSubject implements ISubject {   @override public void dealTask(String task) { //真实角色处理任务 System.out.PRintln("正在"+task); }  }  

代理类:

/* +V.X    java8733 获取更多资源    * 代理类  * 实现ISubject接口  *  持有被代理类的引用  */ public class Proxy implements ISubject {  //持有被代理类的引用 private RealSubject realSubject;  //在构造方法中初始化被代理类 public Proxy(RealSubject r) { this.realSubject=r; }  @Override //在该方法中加入代理逻辑 public void dealTask(String task) { System.out.println("开始帮忙...."); //加入线程睡眠模拟帮忙的行为 try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //真正执行动作的仍然是真实角色 realSubject.dealTask(task); }  }

静态工厂类:

/* +V.X    java8733 获取更多资源    * 静态工厂类  * 对于客户端来说 并不关心执行动作的是代理对象还是真实角色  * 所以我们创建一个静态方法直接返回对象  */ public class statiCFactory {  //调用此方法获得实例 public static ISubject getInstance(){ return new Proxy(new RealSubject()); } }

测试类:

/*  * 测试类(客户类) +V.X   java8733 获取更多资源  */ public class test {  public static void main(String[] args) { //创建代理对象时需要一个真实对象的实例 ISubject instance = StaticFactory.getInstance(); //使用代理类的方法 instance.dealTask("敲代码"); } }

就是这样,真正的业务功能还是有委托类来实现,但是在实现业务类之前的一些公共服务。例如在项目开发中我们没有加入缓冲,日志这些功能,后期想加入,我们就可以使用代理来实现,而没有必要打开已经封装好的委托类。

推荐阅读上海尚学堂java相关技文章,欢迎评论建议,转载请注明出处!

脚本宝典总结

以上是脚本宝典为你收集整理的谈谈Java中的代理模式全部内容,希望文章能够帮你解决谈谈Java中的代理模式所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。