设计模式(十): 代理模式
代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
介绍
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
实现
我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。
ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
步骤 1
创建一个接口。
Image.java
1
2
3
|
public interface Image {
void display();
}
|
步骤 2
创建实现接口的实体类。
RealImage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this .fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println( "Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println( "Loading " + fileName);
}
}
|
ProxyImage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this .fileName = fileName;
}
@Override
public void display() {
if (realImage == null ){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
|
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
ProxyPatternDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
|
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage( "test_10mb.jpg" );
//图像将从磁盘加载
image.display();
System.out.println( "" );
//图像将无法从磁盘加载
image.display();
}
}
|
步骤 4
验证输出。
1
2
3
4
|
Loading test_10mb.jpg
Displaying test_10mb.jpg
Displaying test_10mb.jpg
|
来源:runoob
转载于:https://www.cnblogs.com/luozhijun/p/6896310.html
设计模式(十): 代理模式相关推荐
- Java中的设计模式:“代理模式”的理解
代理模式定义: 为其他对象提供一种代理以控制对这个对象的访问.在面向对象中,有时候直接访问一些对象比较麻烦,所以代理模式就是在这个对象上加上一个访问该对象的访问层.类似于很多明星的事务实际都是交给经纪 ...
- 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...
- C++设计模式之代理模式
这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式.代理模式的使用场合.代理模式的实现代码等内容,需要的朋友可以参考下 前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就 ...
- python中代理模式分为几种_Python设计模式之代理模式实例详解
本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...
- 设计模式笔记——代理模式
设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...
- 「设计模式(五) - 代理模式」
「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...
- Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程
Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍 随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...
- 设计模式之一代理模式
代理模式(代理设计模式) 代理模式的定义与特点 代理模式的结构与实现 代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代 ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
- 三国杀与设计模式之代理模式(Proxy)
本人原博地址:http://blog.saymagic.cn/blog.php?id=17 三国杀案例:在五人局中,作为反贼的黄月英借黄忠的刀杀作为忠臣的夏侯惇,从这句话中我们可以总结出一个成语对不对 ...
最新文章
- iPhone12 safeArea顶部区域尺寸变化
- 将通讯录导入到摩托罗拉A1800通讯录中
- java 强制垃圾回收_Java垃圾回收机制
- 资深算法工程师万宫玺:Java工程师转型AI的秘密法宝——深度学习框架Deeplearning4j | 分享总结
- asp.net后台代码动态添加JS文件和css文件的引用
- LeaFlet学习之结合turf.js生成简单的等值线demo
- MySQL学习第四章课后题
- leetcode53 Maximum Subarray 最大连续子数组
- uni保存canvas图片_小程序canvas【开箱即用】
- dsu on tree入门
- XJOI 3266 Dyeing 染色 题解
- javac无效问题解决
- win7+VS2008安装QT、环境配置以及简单实例演示
- 音视频基础1:H264、H265、MPEG-4、VP8、VP9编码基础知识
- 利用css构建三角形(正三角,倒三角,左/右三角)
- 解决Only fullscreen activities can request orientation的方法
- 还贷款 月供贷款计算
- h0131. 钞票 (15 分)
- 手机qq保存的文件路径
- Topcoder 2016 TCO Algorithm Algo Semifinal 2 Hard
热门文章
- import sys是什么意思_学了半天,import 到底在干啥?
- C++ boost multiprecision类型转换 u256转double
- 在etherscan上传合约源码
- 时间复杂度(3):排序算法的时间复杂度 空间复杂度 总结
- Leetcode之插入区间
- Java UDP小结
- oracle把一列更新为空,ORA-01439:要更改数据类型,则要修改的列必须为空
- svn 仓库 本地 连接_建立Subversion仓库在本地如何操作?
- php之thinkphp3.2.3 文件访问路径,URL路由配置-与重定向
- spark map函数中使用println无法输出