博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈Java中的代理模式
阅读量:6602 次
发布时间:2019-06-24

本文共 1736 字,大约阅读时间需要 5 分钟。

首先来看一下代理模式的定义:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口。代理模式是常用的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 { @Overridepublic 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 blocke.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("敲代码");}}复制代码

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

推荐阅读相关技术文章,欢迎评论建议,转载请注明出处!

你可能感兴趣的文章
Exchange2013 SP1通过 EMS导出及导入PST数据文件
查看>>
Java实现字符串中单词对调
查看>>
Verilog中的VCD(值变转储文件)
查看>>
预览 GitHub 项目里的网页或 Demo
查看>>
我的友情链接
查看>>
Java私塾跟我学系列——JAVA篇 第三章 数组和排序算法
查看>>
微信小程序 - 开发工具界面一览
查看>>
远程连接linux(Ubuntu配置SSH服务)22端口
查看>>
netty与marshalling简单使用
查看>>
优化带来降权得问题九个问题
查看>>
深入了解NTFS for Mac的界面中的五个勾选项 如启用聚关灯搜索
查看>>
ffmpeg遇到inttypes.h找不到
查看>>
mpsl *** 配置
查看>>
Spring data redis pubsub 简单接入
查看>>
IT技术人,不可有傲气,但须有傲骨
查看>>
如何选择适合自己的存储
查看>>
从Exchange 2007升级到Exchange 2010
查看>>
AWS SDK Python
查看>>
局域网通信工具 飞秋
查看>>
等差数列
查看>>