https://blog.csdn.net/luanlouis/article/details/18847313

https://blog.csdn.net/luanlouis/article/details/24589193

Proxy (代理模式)定义

  • Purpose (目的)
  • Structure (结构)
  • Applications (应用)
  • Consequences (结论)

Purpose (目的)

  • 为另外一个对象提供一个代理或占位符以控制对这个对象的访问。

Structure (结构)

  • Proxy角色

    1. (该角色)持有一个RealSubject 角色的引用,用以访问RealSubject。如果RealSubject和Subject角色的接口是相同的,Proxy角色也可以持有一个Subject的引用(不过这个Subject 还是引用的是RealSubject的实现,即父类引用子类对象 :Subject subject=new RealSubject())。
    2. 应该具有和Subject角色完全一致的接口,这样,Proxy角色可以成为RealSubject 的替代品。
    3. 控制对 真正对象访问,并且可以负责创建和删除真正对象。
    4. 其他功能:
    5. 远程代理负责加密请求和参数,然后将加密的请求发送到不同的地址空间的真正对象。
    6. 为真正的对象提供额外的信息。
    7. 保护性质的代理可以为 访问 realSubject请求提供权限控制。
  • Subject : 定义RealSubject和Proxy实现的公共接口。
  • RealSubject : 定义代理要表示的真正的对象。

Applications(应用)

  • 一个远程的代理对不同的地址空间内的对象提供一个本地表示。
  • 可以根据需求控制创建代价昂贵的对象。
  • 为原对象提供访问权限的控制。

Consequences(结论)

  • 代理模式 引入了非直接访问对象的机制 。这种添加的非直接访问,有以下几种应用:

    1. 一个远程的代理对不同的地址空间内的对象提供一个本地表示
    2. 一个虚拟的代理可以优化功能,比如根据需求创建对象。
    3. 保护性代理允许当访问对象时,做一些额外的内部操作。

代理模式应用示例

  • 想要访问某对象,但是不能直接访问某对象场景--车票代售点
  • 为访问对象增加权限控制--用户信息检索系统
  • 增强原对象功能--AOP

想要访问某对象,但是不能直接访问某对象场景--车票代售点

车站设置代售点的原因,一方面是为人流高峰期缓解车站自身压力,另一方面则是对一些偏远地方,购票很不方便的人提供便利。

车站的售票业务主要有:卖票、问询、退票,将其抽象出一个接口TicketService,将功能分别定义为:sellTicket(),inquire()和withdraw()。将车站定义为Station类,实现TicketService接口;而代售点定义为StationProxy,实现TicketService接口,并持有一个Station实例的引用,三个角色之间的关系如下图:

相关代码如下:

[java] view plaincopy
  1. package com.foo.proxy;
  2. /**
  3. * 售票服务接口
  4. * @author louluan
  5. */
  6. public interface TicketService {
  7. //售票
  8. public void sellTicket();
  9. //问询
  10. public void inquire();
  11. //退票
  12. public void withdraw();
  13. }
[java] view plaincopy
  1. package com.foo.proxy;
  2. /**
  3. * 售票服务接口实现类,车站
  4. * @author louluan
  5. */
  6. public class Station implements TicketService {
  7. @Override
  8. public void sellTicket() {
  9. System.out.println("\n\t售票.....\n");
  10. }
  11. @Override
  12. public void inquire() {
  13. System.out.println("\n\t问询。。。。\n");
  14. }
  15. @Override
  16. public void withdraw() {
  17. System.out.println("\n\t退票......\n");
  18. }
  19. }
[java] view plaincopy
  1. package com.foo.proxy;
  2. /**
  3. * 车票代售点
  4. * @author louluan
  5. *
  6. */
  7. public class StationProxy implements TicketService {
  8. private Station station;
  9. public StationProxy(Station station){
  10. this.station = station;
  11. }
  12. @Override
  13. public void sellTicket() {
  14. // 1.做真正业务前,提示信息
  15. this.showAlertInfo("××××您正在使用车票代售点进行购票,每张票将会收取5元手续费!××××");
  16. // 2.调用真实业务逻辑
  17. station.sellTicket();
  18. // 3.后处理
  19. this.takeHandlingFee();
  20. this.showAlertInfo("××××欢迎您的光临,再见!××××");
  21. }
  22. @Override
  23. public void inquire() {
  24. // 1做真正业务前,提示信息
  25. this.showAlertInfo("××××欢迎光临本代售点,问询服务不会收取任何费用,本问询信息仅供参考,具体信息以车站真实数据为准!××××");
  26. // 2.调用真实逻辑
  27. station.inquire();
  28. // 3。后处理
  29. this.showAlertInfo("××××欢迎您的光临,再见!××××");
  30. }
  31. @Override
  32. public void withdraw() {
  33. // 1。真正业务前处理
  34. this.showAlertInfo("××××欢迎光临本代售点,退票除了扣除票额的20%外,本代理处额外加收2元手续费!××××");
  35. // 2.调用真正业务逻辑
  36. station.withdraw();
  37. // 3.后处理
  38. this.takeHandlingFee();
  39. }
  40. /*
  41. * 展示额外信息
  42. */
  43. private void showAlertInfo(String info) {
  44. System.out.println(info);
  45. }
  46. /*
  47. * 收取手续费
  48. */
  49. private void takeHandlingFee() {
  50. System.out.println("收取手续费,打印发票。。。。。");
  51. }
  52. }
[java] view plaincopy
  1. package com.foo.proxy;
  2. /**
  3. * 客户端角色
  4. * @author louluan
  5. */
  6. public class Client {
  7. public static void main(String[] args) {
  8. //创建Station
  9. Station service = new Station();
  10. //创建代理类
  11. StationProxy proxy = new StationProxy(service);
  12. //代售点售票
  13. proxy.sellTicket();
  14. }
  15. }

执行结果:

为访问对象增加权限-用户信息检索系统

公司有一个用户信息检索系统,管理员可以检索用户的基本信息,教育背景,和账户信息。由于业务发展的需要,此系统要跟公司实现信息共享,需要向别的公司提供我们的接口,但是信息共享并不是全部共享,只允许别的公司查询基本信息和教育背景,而有些敏感信息账户信息不允许别的公司调用的,在这里可以设置一个代理,用于控制访问查询信息接口的权限控制,当是外部想要查询账户信息时,给你返回 "********"掩码展示。

定义一个UserInfoService接口,有getBasicInfo(),getEducationalBackground(),getAcccountInfo()分别用于查询基本信息,教育背景,账户信息;

UserInfoServiceImpl类实现UserInfoService接口;

UserInfoServiceProxy类作为代理类,实现UserInfoService接口和持有一个UserInfoServiceImpl引用:

[java] view plaincopy
  1. package com.foo.proxy1;
  2. /**
  3. * 信息查询接口
  4. */
  5. public interface UserInfoService {
  6. //基本信息
  7. public String getBasicInfo();
  8. //教育背景
  9. public String getEducationalBackground();
  10. //账户信息
  11. public String getAcccountInfo();
  12. }
[java] view plaincopy
  1. package com.foo.proxy1;
  2. /**
  3. * 查询接口实现
  4. * @author louluan
  5. */
  6. public class UserInfoServiceImpl implements UserInfoService {
  7. @Override
  8. public String getBasicInfo() {
  9. return "Basic Info....";
  10. }
  11. @Override
  12. public String getEducationalBackground() {
  13. return "Educational Background.....";
  14. }
  15. @Override
  16. public String getAcccountInfo() {
  17. return "Account Info.....";
  18. }
  19. }
[java] view plaincopy
  1. package com.foo.proxy1;
  2. /**
  3. * 信息查询代理控制访问权限
  4. * @author louluan
  5. */
  6. public class UserInfoServiceProxy implements UserInfoService {
  7. private UserInfoService impl;
  8. private String role;
  9. public UserInfoServiceProxy(UserInfoService impl,String role)
  10. {
  11. this.impl = impl;
  12. this.role = role;
  13. }
  14. @Override
  15. public String getBasicInfo() {
  16. return impl.getBasicInfo();
  17. }
  18. @Override
  19. public String getEducationalBackground() {
  20. return impl.getEducationalBackground();
  21. }
  22. @Override
  23. public String getAcccountInfo() {
  24. //如果是公司本部,返回
  25. if("1".equals(role))
  26. {
  27. return impl.getAcccountInfo();
  28. }
  29. //禁止访问impl方法,返回****
  30. return "**********";
  31. }
  32. }
[java] view plaincopy
  1. package com.foo.proxy1;
  2. public class Client {
  3. public static String OUT="0";
  4. public static String IN="0";
  5. public static void main(String[] args) {
  6. UserInfoService service = new UserInfoServiceImpl();
  7. UserInfoServiceProxy proxy = new UserInfoServiceProxy(service,OUT);
  8. //外部公司查询信息
  9. System.out.println("*****外部公司查询信息*******");
  10. //获取基本信息:
  11. String basicInfo = proxy.getBasicInfo();
  12. System.out.println("基本信息:"+basicInfo);
  13. //教育背景
  14. String educationalBackground = proxy.getEducationalBackground();
  15. System.out.println("教育背景:"+educationalBackground);
  16. //账户信息
  17. String accountInfo = proxy.getAcccountInfo();
  18. System.out.println("账户信息:"+accountInfo);
  19. }
  20. }

增强原对象的功能---AOP

代理模式最有魅力的地方就在于它实现了AOP(Aspect-Oriented  Programming),即面向切面的编程。

Java 设计模式 代理模式相关推荐

  1. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  2. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  3. Java设计模式-代理模式笔记

    代理模式 0 什么是代理模式 理解方式1 理解方式2 1 静态代理 1.1 代码实现 1.2 方法解读 1.3 优缺点 2 动态代理 2.1 具体实现 2.2 方法解读 2.3 注意 3 Cglib代 ...

  4. 通俗易懂说java设计模式-代理模式

    基本概念 代理模式,和我们在生活中所理解的"代理"思想并没有太大的区别.代理模式的实现需要我们设计一个代理类,在不直接访问被代理对象的前提下,通过代理类实现对被代理对象的间接访问, ...

  5. JAVA设计模式--代理模式(静态)

    目录 一.什么是代理模式 二.静态代理模式的结构 三.静态代理模式应用举例 应用一 应用二 四.代理模式的应用场景 五.静态代理模式的特点 一.什么是代理模式 代理(Proxy)模式为其他对象提供一种 ...

  6. Java设计模式—代理模式

    1. 什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2. 代理模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标 ...

  7. java设计模式-代理模式初探

    根据圣思园的视频,整理的java代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间 ...

  8. JAVA设计模式 - 代理模式

    在对象的一个业务方法完成之后, 有时候我们可能需要去添加一些新的功能(前置校验等). 但我们又不想更改原来的代码 , 代理模式就为我们提供了一种解决方案 . 1 . 代理模式的定义 代理模式就是在不改 ...

  9. Java设计模式——代理模式

    文章目录 1.简介 2.推荐实现案例 3.优缺点 3.1 优点 3.2 缺点 4.应用场景 5.注意事项 6.拓展 6.1 普通代理 6.2 强制代理 6.3 代理类的个性 6.4 动态代理 7.最佳 ...

  10. Java设计模式--代理模式

    1. 代理模式的引入 王大爷借了小李1.5亿,小赖是个无赖横竖就是不还钱,王大爷身子弱讨不回钱就请了讨债公司的小强,最后小强通过一系列**(过于残暴被打码了)的手段帮助王大爷讨回欠款.完事后还帮王大爷 ...

最新文章

  1. presto能连接mysql和hive吗_Presto连接Hive
  2. eclipse集成lombok
  3. 边缘计算 — 起源与定义
  4. 如何知道刚刚插入数据库那条数据的id
  5. 理论+实践轻松掌握nohup java -jar xxxx.jar /dev/null 21 意义
  6. Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
  7. Spring 核心特性
  8. 开学一月,可以自己玩自己做的游戏了!!!
  9. PPP认证方式pap chap chap2
  10. win2008 php mysql zend phpmyadmin_Windows2008 最新版Apache2.PHP5.MySQL6.PHPMyadmin.ZendOptimizer安装图解...
  11. c语言24点游戏代码回法,C语言解24点游戏程序
  12. 浅复制和深复制的区别?//浅拷贝和深拷贝
  13. 驳《寒门再难出贵子》——谁说寒门大学生没有春天!
  14. 计算机主板 g41,g41主板bios设置方法
  15. Linux:struct dirent
  16. c++输出字符串结尾部分中文乱码问题
  17. 安装CloudReady,体验Chrome OS
  18. 铁路订票系统的简单设计
  19. android 蓝牙耳机 找不到驱动程序,bluetooth外围设备找不到驱动程序现象的解决方法介绍...
  20. MongoDB 存放图片

热门文章

  1. Silicio for Mac(迷你播放器)免费版
  2. VEGAS不等双11,提前嗨购!助你成为视频大神!
  3. linux 下搭建自己的 git 服务器以及配置多用户
  4. 在FL Studio中编辑视频中的音频
  5. get_posts 函数 | wordpress
  6. 前端开发的模块化和组件化的定义,以及两者的关系?
  7. Aix5~6小机运维
  8. 三层交换原理及实验操作
  9. 获取GridView控件总列数
  10. 浅谈 MVC3 WebMail 发送邮件