全文共1439字,预计阅读时间:10分钟

定义:

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
代理模式是一种比较贴近于生活的 设计模式,现实生活中也有很多代理模式的例子:
  1. 住酒店不一定需要亲自到酒店去,还可以通过微信支付下的同程艺龙来订酒店。
  2. 我们可以通过中介去找房子,不用直接跟房东沟通(现实生活中,我们更希望直接跟房东沟通)
  3. 春运买票买不到,我们可以找黄牛替我们抢票
  4. 想访问国外的网站,可以使用代理服务器进行访问。
代理模式通常解决的问题是,我们没有办法直接访问某一个对象,但是却想使用这个对象的一些功能,这个时候我们就可以创建一个代理对象,通过访问代理对象,间接的访问这个对象。
我们想去旅行,但是没有办法提前去目的地订酒店,所以我们通过同程艺龙来订酒店。同程艺龙就是一个代理对象,他和酒店一样,提供了订酒店的方法。
我们没有渠道去直接联系房东,所以我们可以通过中介公司租房,房东把租房这件事委托给了中介公司,这里中介公司就是一个代理对象。代理对象除了调用真实对象的方法,还可以对方法进行增强。比如中介公司可以赚差价。

图解:

这里可以看出,无论是代理对象和被代理对象,都实现了Subject接口,同时被代理对象作为代理对象的成员变量。这个结构与装饰模式非常像,下图是装饰模式的示意图:

那么它们之间有什么区别呢?

首先从定义上可以看出,装饰模式强调的是添加职责,而代理模式强调的是间接访问。
其次从结构设计上来说,装饰模式是将一个个功能进行拆分,使用时再动态的进行组装,生成不同功能的对象。而代理模式却是在编译之前就已经确定了代理对象和被代理对象之间的关系。
最后就使用上来说,装饰模式需要客户端去组装对象,而代理模式却只需要客户端去调用代理对象,代理对象和被代理对象的关系被封装到了代理对象中,对用户而言是无感的。

实例:

这里举一个订酒店的实例,小赵在同程艺龙上预定了橘子酒店,这里酒店就是图中的Subject,它提供了订酒店、付款的方法,橘子酒店就是RealSubject,它是酒店的一个具体实现。而同程艺龙作为酒店的代理,提供优质的客户服务,其中包括订酒店前的电话确认、订酒店后的客户回访、付款时提供红包减免等。

代码:

/*** 酒店.** @author jialin.li* @date 2019-12-27 11:37*/
public interface Hotel {/** 订酒店 **/void hotelBooking(String name);/** 付款 **/double pay();
}
/*** 橘子酒店.** @author jialin.li* @date 2019-12-27 13:17*/
public class OrangeHotel implements Hotel {@Overridepublic void hotelBooking(String name) {System.out.println(name + ",欢迎入住橘子酒店");}@Overridepublic double pay() {return 120d;}
}
/*** 同程艺龙** @author jialin.li* @date 2019-12-27 13:20*/
public class Elong implements Hotel{private Hotel hotel;public Elong() {hotel = new OrangeHotel();}@Overridepublic void hotelBooking(String name) {System.out.println(confirm(name));hotel.hotelBooking(name);System.out.println(callback(name));}@Overridepublic double pay() {return useHongbao(hotel.pay());}private String confirm(String name){return "亲爱的"+name+"您预定了橘子酒店,记得入住哦!";}private String callback(String name){return "亲爱的"+name+"您的入住已经结束,有问题请及时反馈!";}private double useHongbao(double price){return price - 50.0d;}
}
/*** 测试类.** @author jialin.li* @date 2019-12-27 13:36*/
public class Main {public static void main(String[] args) {String xiaozhao = "小赵";Elong elong = new Elong();elong.hotelBooking(xiaozhao);System.out.print("共花费了:");System.out.println(elong.pay());}
}

结果:

亲爱的小赵您预定了橘子酒店,记得入住哦!
小赵,欢迎入住橘子酒店
亲爱的小赵您的入住已经结束,有问题请及时反馈!
共花费了:70.0

有没有什么问题?

可以看出,我们在代理类中直接引用了被代理对象,所以代理类和被代理类是一种一对一的关系,即我们需要为每一个被代理类,创建一个代理类。
假设我们现在有一个打点的需求,要为系统中的一批对象增加记录日志的方法,如果使用代理模式,就要为这一批对象创建代理类,这样的工作量是无疑是巨大的。那么有没有什么办法可以让我们可以少写或者不写代理类,却能完成代理功能呢?这就要引出了我们要讲的一个概念——动态代理(动态代理涉及到、反射类加载的一些知识,所以在下一篇文章中讲解)
期待您的关注、推荐、收藏,同时也期待您的纠错和批评。

三分钟带您搞懂代理模式相关推荐

  1. 明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...

    类型别名(type alias)一个名字,是某种类型的同义词.使用类型名有很多好处,能让复杂的类型名字变得简单明了,易于理解和使用. 有两种方法可用于定义类型别名.传统的方法是使用关键字typedef ...

  2. 三分钟带你搞懂什么是向上转型和向下转型

    什么是向上转型? 通过在网上查了资料,和普遍的介绍,一句话总结就是"父类引用指向子类对象",例: Human h=new Human(); h.eat();//人类 Animal ...

  3. 三分钟带你搞懂Spring解耦和IOC

    前言 回想写过的图书管理系统.租房系统.电影院卖票系统都是基于原生的JavaSE.OOP,没有用到任何框架,在层与层的关系中一个类要想获得与其他类的联系主要的方式还是靠new,这就导致层与层之间.对象 ...

  4. 三分钟带你弄懂slot插槽——vue进阶

    文章目录 三分钟带你弄懂slot插槽--vue进阶 一.概述 程序员之死 什么是 slot插槽? 2.6.0 版本中的 slot 二.具名插槽 例子 效果图 代码 三.小惊喜 三分钟带你弄懂slot插 ...

  5. 五分钟学会python函数_五分钟带你搞懂python 迭代器与生成器

    前言 大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法.对于获取数据的方法而言,我们会一种就 ...

  6. 三分钟带你看懂prototype原型——ES6进阶

    三分钟带你看懂prototype原型--ES6进阶 1. prototype 定义 2. new 构造函数 3. 存储 4. prototype 作用 1. prototype 定义 在JS中的类的实 ...

  7. 别再说不了解非接触液位传感器了?只需三分钟就能搞懂

    非接触式液位传感器,顾名思义就是不用接触物体就能进行监测,从而避免遭到被监测物体的腐蚀等.那关于非接触式液位传感器,大家了解多少呢?今天TCOOP就来给大家详细介绍下,三分钟就能搞懂,快来看看吧! 一 ...

  8. 三分钟带你看懂HDMI接口的PCB设计

    三分钟带你看懂HDMI接口的PCB设计 本文主要讲解的是HDMI的设计,包括作用和运用的总结,希望大家看了以后能轻松的应对各种HDMI方案的PCB设计. 一.什么是HDMI? 高清晰度多媒体接口(英文 ...

  9. 三分钟带你读懂 BERT

    本文为 AI 研习社编译的技术博客,原标题 : BERT Technology introduced in 3-minutes 作者 | Suleiman Khan, Ph.D. 翻译 | 胡瑛皓.s ...

最新文章

  1. 文件格式和扩展名不匹配.文件可能已损坏_自媒体良器:音频文件批处理,FFmpeg一行搞定!果断收藏...
  2. 你的画像是怎么来的?推荐系统是如何找到相似用户的?
  3. [UVa10296]Jogging Trails
  4. 【python】解决:TypeError: can't send non-None value to a just-started generator
  5. 递归求n的阶层算法实现
  6. app启动页自动跳转源码_Jenkins集成appium自动化测试(Windows篇)
  7. 华为Matebook X Pro双系统升级bios后无法进入Linux的解决方案
  8. 使用JVM钩子函数关闭资源
  9. opencv识别圆的代码(转)
  10. python 启动参数_python启动参数
  11. 【故障处理】CRS-1153错误处理
  12. 重装驱动:Failed to initialize NVML: Driver/library version mismatch
  13. 解析JavaScript模拟事件的注意要点
  14. 3分钟搞懂什么是WPF。
  15. Android--NFC读写
  16. 深入理解JVM---JVM垃圾回收机制
  17. pubg解封验证计算机怎么验证,绝地求生解封教程
  18. w ndows 10关机快捷键,win10关机有什么快捷键 win10关机快捷键及使用小技巧【图文】...
  19. 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
  20. 计算机考研有什么公众号,大学生应该关注的公众号有哪些推荐?

热门文章

  1. 《学习OpenCV3》(中文版)环境配置摘记
  2. CRD500:Modelsim仿真问题
  3. 这么简单也做不了?这2种人别做自媒体了,月薪肯定不超3000
  4. 重磅:如何不花钱就成为数据科学家?
  5. Gamma分布与逆Gamma分布
  6. .NET 初中级面试题
  7. 缺陷与出路——一个游戏开发者的反思
  8. deepin20.4为绿色软件创建桌面图标
  9. layui 引入方式
  10. WPF入门教程(八)--依赖属性(4)