一、代理模式概述

由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。

定义如下:

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

二、代理模式结构和实现

2.1 代理模式结构

代理模式包含3个角色:

  1. Subject(抽象主题角色):声明了真实主题和代理主题的共同接口。
  2. Proxy(代理主题角色):包含了对真实主题的引用。
  3. RealSubject(真实主题角色):实现了真实的业务操作。

2.2 代理模式实现

代理模式有很多种实现,根据目的和实现方式不同可以分为很多种。

本文demo案例介绍下静态代理和JDK动态代理这两种。

静态代理

//抽象主题对象

public interface Subject {void request();}

//具体的真实主题对象

public class RealSubject implements Subject{@Overridepublic void request() {System.out.println("真实主题的业务方法");}
}

//代理对象

public class ProxySubject implements Subject{private Subject subject = new RealSubject();@Overridepublic void request() {System.out.println("前置方法代码");subject.request();System.out.println("后置方法代码");}
}

动态代理

//抽象主题对象

public interface IUserDao {void save();}

//具体的真实主题对象

public class UserDao implements IUserDao{@Overridepublic void save() {System.out.println("保存了数据");}
}

//代理对象

public class IUserDaoFactory {//代理的目标对象private Object target;public IUserDaoFactory(Object target) {this.target = target;}//对目标对象进行动态代理public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("做一些操作A");Object resultValue = method.invoke(target, args);System.out.println("做一些操作B");return resultValue;}});}
}

//客户端

public class Client {public static void main(String[] args) {//静态代理Subject subject = new ProxySubject();subject.request();//JDK动态代理demoIUserDao userDao = new UserDao();IUserDaoFactory factory = new IUserDaoFactory(userDao);IUserDao proxyUserDao = (IUserDao) factory.getProxyInstance();proxyUserDao.save();}
}

三、代理模式优缺点和适用环境

3.1 代理模式的优点

  1. 协调调用者和被调用者,在一定程度上降低了系统的耦合度;
  2. 系统具有较好的灵活性和可扩展性,客户端可以针对抽象主题角色进行编程,增加和更换代理类无需修改源码,符合开闭原则。

3.2 代理模式的缺点

  1. 有些类型的代理模式可能会造成请求的处理速度变慢;
  2. 实现代理模式需要一些额外的工作,而且有些代理模式的实现过程较为复杂。

3.3 代理模式的适用环境

代理模式的类型较多,不同类型的代理模式有不同的优缺点,应用于不同的场合。

  1. 客户端对象需要访问远程主机中的对象时,使用远程代理。
  2. 使用较少资源对象代表较大资源对象时,使用虚拟代理。
  3. 控制对象为不同用户提供不同的权限时,使用保护代理。
  4. 为一个对象提供额外的操作,使用智能引用代理。
  5. 为被频繁访问的操作结果提供缓存,加速响应,使用缓存代理。

【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。

【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git

【设计模式】第15章·代理模式相关推荐

  1. 第 15 章 代理模式

    第 15 章 代理模式 1.代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问. 即通过代理对象访问目标对象. 代理对象的好处是:可以在目标对象实现的基础上,增强额外的功能操 ...

  2. 【设计模式】第二章 代理模式

    第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...

  3. 设计模式笔记15:代理模式(Proxy Pattern)

    一.代理模式的内容        代理模式为另一个对象提供一个替身或占位符以访问这个对象.         给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...

  4. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  5. 设计模式(四)--代理模式

    设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...

  6. 【设计模式与体系结构】代理模式

    [设计模式与体系结构]代理模式 文章目录 [设计模式与体系结构]代理模式 一.实例分析 二.代码实现 三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序. 要求:房产中介有介绍和代 ...

  7. 设计模式学习之1—代理模式

    设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...

  8. 《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回

    通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) 文章目录 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) @[toc] 一.单例模式 1. 相关概念 2. 演示思路 3. ...

  9. Head First设计模式读书笔记十 第十一章 代理模式

    之前的总结链接 https://blog.csdn.net/u011109881/article/details/59191308 代理模式本身的框架结构并不难理解,但是在实际应用中,我们往往被实际应 ...

最新文章

  1. Android Html.fromHtml 的使用
  2. 我的Android进阶之旅------Android嵌入图像InsetDrawable的用法
  3. 虚拟机WIN7显示主机ubuntu的文件
  4. [日更-2019.5.2、3、4] 关于JVM的概略分析
  5. python信息管理系统统计功能_用Python实现职工信息管理系统
  6. python安装email模块_Python使用SMTP模块、email模块发送邮件
  7. 在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
  8. Java实现生产消费模型的5种方式
  9. 大数据 -- Spark
  10. Collection集合 创建/添加/迭代
  11. iOS 对付内存泄漏,来说说我的调试方法
  12. copula函数(高斯copula函数)
  13. JavaScript实现简单计算器
  14. C# PPT/PDF文件转图片,图片转PPT
  15. 《麻省理工学院公开课:人工智能》笔记一
  16. GHO文件安装全教程
  17. 设计心理学2-与复杂共处【读书笔记】
  18. 程序的优化 文字的减法
  19. Swift和正则表达式:语法
  20. 如何对网站漏洞修补进行渗透测试

热门文章

  1. 计算机项目管理常用词汇,项目管理英文词汇B-C
  2. Elasticsearch笔记五之java操作es
  3. C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原
  4. 我的世界服务器物品不掉落指令,我的世界指令死亡不掉落
  5. div里的元素相对于该div水平居中和垂直居中
  6. C语言--指针和数组
  7. CSS实现顶部三角形矩形
  8. 石油测井专题(十二)石英挠性加速度计LH309伺服电路
  9. P-tuning v1 v2
  10. 锐龙R7 Pro 4700G和R7 3700x 的区别 哪个好