代理模式Proxy Pattern

代理模式Proxy Pattern

引入

在这里插入图片描述
在这里插入图片描述
就像上面描述的一样,这个秘书相当于老板的代理

代理模式

定义与解释
GOF所著《Design Patterns》:
为其他对象提供一种代理以控制对这个对象的访问。
解释:
当用户希望和某个对象打交道,但程序可能不希望用户直接访问该对象,而是提供一个特殊的对象,这个特殊的对象就被称为当前用户想要访问对象的代理,程序让用户和对象的代理打交道,即让用户通过访问代理来访问想要访问的对象。
代理与所代理的对象实现了相同的接口,也就是说代理和它所代理的对象向用户公开了相同方法,当用户请求代理调用这个方法时,代理可能需要验证某些信息或检查它所代理的对象是否可用,当代理确认它所代理的对象能调用相同的方法时,就把实际的方法调用委派给它所代理的对象。

1.角色:

抽象主题Subject
实际主题RealSubject
代理Proxy

3.简陋非规范的UML类图:

在这里插入图片描述

4 分类

按职责来划分,分为如下:
远程代理
虚拟代理
Copy-on-Write 代理
保护(Protect or Access)代理
Cache代理
防火墙(Firewall)代理
同步化(Synchronization)代理
智能引用(Smart Reference)代理

如下介绍远程代理和虚拟代理:

1.远程代理

java在RMI(Remote Method Invocation,远程方法调用)中是如何使用代理模式的。
RMI是一种分布式技术,使用RMI可以让一个JVM上的应用程序调用位于网络另一处JVM上的对象方法。习惯上称发出调用请求的JVM为本地客户机,称接收并执行请求的JVM为远程服务器。
RMI不希望客户应用程序直接与远程对象打交道,替代地让用户程序和远程对象的代理打交道,RMI会生成一个存根(Stub),一张特殊的字节码,并让这个存根产生的对象作为远程对象的代理,即远程代理。远程代理驻留在客户端,也就是说需要把RMI生成的存根复制或下载到客户端[实际项目设计中,可以提供Web服务让用户下载]。因此,在RMI中,用户实际上是在和远程代理直接打交道,但用户并没有感觉。

在这里插入图片描述

2.虚拟代理

如一个对象的创建需要花费较多的时间,就应该给该对象提供一个代理,习惯上称这样的代理为虚拟代理,当用户请求一个”大”的对象时,虚拟代理在该对象真正被创建出来之前扮演着替身的角色,当该对象被创建出来之后,虚拟代理就将用户的请求直接委托给该对象。

5.应用实例

1>.销售代理
2> 黄牛
3>.秘书老板
4>.Spring AOP面向切面编程。(AOP:Aspect Oriented Programming)
JDK动态代理:
接口实现类的方式实现,代理对象是实现了接口的类的实例。
CGLIB动态代理:
继承方式实现。代理对象:业务类的子类的实例。但目标类不能是final类型(类是final不能被继承),目标类里面的方法也不能是final类型(方法是final不能被重写)。
案例判断用户是否登录:
案例1:使用JDK动态代理判断用户是否登录。
案例2:使用CGLIB动态代理判断用户是否登录。

6.优缺点

优点:
1.代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦;职责清晰。
2.使用代理来担当那些创建耗时的对象的替身。

缺点:
1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

8.使用场景
1.程序可能不希望用户直接访问该对象,而是提供一个特殊的对象以控制对当前对象的访问。
2.若一个对象(如很大的图像)需要很长时间才能加载完成。
3.若对象位于远程主机上,需要为用户提供访问该远程对象的能力。

9.与适配器和装饰器的区别
适配器:插头-插座
在这里插入图片描述

装饰器:
小鸟+喷射器。
在这里插入图片描述

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值