Java 设计模式_代理模式(2016-08-19)
概念:
代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
类图:
在代理模式中的角色:
● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
● 目标对象角色:定义了代理对象所代表的目标对象。
● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
源代码
抽象对象角色
public abstract class AbstractObject {//操作public abstract void operation(); }
目标对象角色
public class RealObject extends AbstractObject {@Overridepublic void operation() {//一些操作System.out.println("一些操作");} }
代理对象角色
public class ProxyObject extends AbstractObject{RealObject realObject = new RealObject();@Overridepublic void operation() {//调用目标对象之前可以做相关操作System.out.println("before"); realObject.operation(); //调用目标对象之后可以做相关操作System.out.println("after");} }
客户端
public class Client {public static void main(String[] args) {// TODO Auto-generated method stubAbstractObject obj = new ProxyObject();obj.operation();}}
从上面的例子可以看出代理对象将客户端的调用委派给目标对象,在调用目标对象的方法之前跟之后都可以执行特定的操作。
应用场景
现实世界中,秘书就相当于一个代理,老板开会,那么通知员工开会时间、布置会场、会后整理会场等等开会相关工作就可以交给秘书做,老板就只需要开会就行了,不需要亲自做那些事。同理,在我们程序设计中也可使用代理模式来将由一系列无关逻辑组合在一起的代码进行解耦合,比如业务代码中的日志代码就可以在代理中进行。Spring的AOP就是典型的动态代理应用。
代理模式的应用形式
(1)远程代理(Remote Proxy) -可以隐藏一个对象存在于不同地址空间的事实。也使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。(JAVA RMI)
(2)虚拟代理(Virtual Proxy) – 允许内存开销较大的对象在需要的时候创建。只有我们真正需要这个对象的时候才创建。
(3)写入时复制代理(Copy-On-Write Proxy) – 用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。是虚拟代理的一个变体。
(4)保护代理(Protection (Access)Proxy) – 为不同的客户提供不同级别的目标对象访问权限
(5)缓存代理(Cache Proxy) – 为开销大的运算结果提供暂时存储,它允许多个客户共享结果,以减少计算或网络延迟。
(6)防火墙代理(Firewall Proxy) – 控制网络资源的访问,保护主题免于恶意客户的侵害。
(7)同步代理(SynchronizationProxy) – 在多线程的情况下为主题提供安全的访问。
(8)智能引用代理(Smart ReferenceProxy) - 当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
(9)复杂隐藏代理(Complexity HidingProxy) – 用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Façade Proxy),这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。
代理模式与装饰者模式的区别
代理模式:在不改变接口的前提下,控制对象的访问
例子:孙悟空扮演并代替高家三小姐
孙悟空扮演高家三小姐,所以可以说孙悟空与高家三小姐具有共同的接口。如果猪八戒只想 见见高家三小姐的娇好面容,或者谈谈天说说地,那么高家三小姐的“代理”孙悟空是允许 的,但猪八戒想亲亲嘴,那么是不行的。这是保护代理模式的应用。只有代理对象认为合适 时,才会将客户端的请求传递给真实主题对象。
装饰模式:在不改变接口的前提下,动态扩展对象的功能
孙悟空有七十二般变化,在二郎神眼里,他永远是那只猢狲。装饰模式以对客户透明的方式 动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有 什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。他的每 一种变化都给他带来一种附加的本领。他变成鱼 儿时,就可以到水里游泳;他变成雀儿时, 就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。装饰模式以 对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在 装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能 加以扩展。
java动态代理
呵呵,以后再补。看不下去设计模式了。转战JavaScript的。
参考抄袭复制来源:
http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
http://blog.csdn.net/jackiehff/article/details/8621517
http://www.cnblogs.com/machine/archive/2013/02/21/2921345.html
转载于:https://www.cnblogs.com/scevecn/p/5787177.html
Java 设计模式_代理模式(2016-08-19)相关推荐
- Java设计模式(三) -- 代理模式
代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...
- java设计模式之代理模式详解
代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...
- java设计模式之代理模式多种写法(三)
背景 代理模式属于结构型模式,代理模式也是我们开发中常用的设计模式之一,本次讲解以下几种代理模式的写法,希望可以帮助大家更快的理解代理模式,包括自己写一个动态代理的方法. 静态代理 package c ...
- Java设计模式之代理模式(Proxy)
参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...
- Java设计模式-Proxy代理模式
问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...
- Java 设计模式之代理模式
1.静态代理 被代理对象和代理对象都要实现相同的接口或者继承相同的父类. 不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护. 1)首先 ...
- java设计模式之——代理模式
1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...
- Java设计模式之代理模式
示例为最经典的西门庆示例 1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理 ...
- Java面试_代理模式
在我们开始研究代理模式时,我们首先要知道代理模式是什么,之后再对正向代理,反向代理,静态代理和动态代理,下面我们从代理模式开始逐步介绍. 代理模式: 代理(Proxy)是GOF23中设计模式中的一种. ...
最新文章
- java时间转换为字符串格式错误_字符串转换为日期时间格式及其错误处理(转)
- java的队列_java实现队列
- 126. Word Ladder II
- 多图文帖智能封面提取方案
- ibatis(0)ibatis 与 mybatis 简述
- Java List添加元素
- 怎么把照片做成消消乐_开心消消乐特效怎么制作 制造的几种方式分享
- 12月3号 命名规范和运算符的使用
- JAVA在线编译,无需环境变量
- HTML5新表单新功能解析
- db2 springboot 整合_Spring boot Mybatis 整合(完整版)
- 修改SAP下载文件路径
- 【3dmax千千问】初学3dmax插件神器第17课|VRAY渲染教程|哪三种表现方式最能影响3dmax疯狂模渲大师设计效果图的写实程度?食住玩3dmax入门到精通进阶教程
- Git遇到Unable to create 'E:/xxx/.git/index.lock': File exists.的解决办法
- 利用Python使图片完美去除水印,我想试试马赛克的效果∧v∧
- Spring事务(Transaction)
- 建筑竞赛获奖项目解析国外教程
- web安全-文件上传(Js,MIME,文件头,黑白名单等校验)
- 虚拟同步发电机_测量虚拟同步发电机惯量与阻尼系数的新方法
- Android PowerManagerService简单分析
热门文章
- xp系统蓝屏代码7b_电脑蓝屏重启不求人!学会这个方法,自己就能轻松解决!...
- 【J2SE】java概述
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
- 适用于CUDA GPU的Numba 随机数生成
- 实时实例分割的Deep Snake:CVPR2020论文点评
- 【注意事项】Markdown遇到的小问题
- [JavaScript] JavaScript数组挖掘,不只是讲数组哟(2)
- Value xxx of type org.json.JSONObject cannot be converted to JSONArray
- 使用码云给同事地址地址注意事项
- java字符串去掉空格