Java设计模式中代理模式应用详解
lpf_wei 人气:1编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观。
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。找女朋友、找保姆、找工作等都可以通过找中介完成。
在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。
1.代理设计模式定义
代理模式:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
2.代理设计模式的优点与不足
代理模式的主要优点有:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
其主要缺点是:
- 代理模式会造成系统设计中类的数量增加
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
也可以考虑使用动态代理
3.代理设计模式的实现思路
代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。
代理模式的主要角色如下:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
4.代理设计模式代码示例
示例场景介绍:在拍摄预览的时候,可以渲染各种特效,比如:磨皮,美白,滤镜等,但是假如不能直接渲染美妆特效,那么美妆特效就可以使用代理的方式添加。
public interface IEffect { String renderEffect(); } public class EffectImpl implements IEffect { @Override public String renderEffect() { System.out.println("渲染美白特效成功"); return "美白"; } } public class MakeUpEffectImpl implements IEffect { @Override public String renderEffect() { System.out.println("渲染美妆成功"); return "美妆"; } } public class ProxyOrder implements IEffect { /** * 代理类持有被代理的对象 ,进行操作的时候,执行的是持有的代理类的相应逻辑 */ private IEffect orderService = new MakeUpEffectImpl(); @Override public String renderEffect() { System.out.println("开始渲染美妆"); orderService.renderEffect(); System.out.println("渲染美妆结束"); return "增加了美妆特效"; } } public static void main(String[] args) { IEffect orderService = new ProxyOrder(); orderService.renderEffect(); }
通过代理类,进行了美妆的渲染操作,并且进行打印,可以认为对功能进行了增强。
5.代理设计模式的应用场景
当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。
- 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
- 虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。
- 安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。
- 智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。
- 延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate中就存在属性的延迟加载和关联表的延时加载。
加载全部内容