设计模式----代理模式
2015-08-09 10:16
316 查看
话说代理模式,其实就是一个类想要完成的操作,通过它的好朋友proxy替它完成。那代理模式又分为静态代理和动态代理。
那今天就先来说一说静态代理模式。在大话设计模式中,看到大鸟是这样写的:
一个叫戴笠的男生,想追一个叫娇娇的女生,于是他就想到了一个办法去追求娇娇。就是每次都将自己想要送给娇娇的东西说成他的好朋友卓贾易送的,久而
久之娇娇也就看出来了,就和戴笠在一起了。
然后看完我的感受就是:
实际的设计模型就是:
设计一个 代理接口:
然后 追求者类和代理者类都实现 代理接口
然而并不是两个类一模一样,代理者类中实现的 代理接口的方法中 调用的是 追求者实现的代理接口的方法
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。
以struts2中的ActionProxy为例分析:
代理接口:
真实类:
代理类:
那这样,一个静态的代理模式就基本完成了。但是实际的Struts2中的ActionProxy 用的是DynamicProxy模式,今天呢就暂时先讲一讲静态代理完成Struts2中的ActionProxy吧。
代理模式一般应用场景:
第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
例如,当我在一个web应用中,引用struts框架,那我就需要导入一些jar包,然后会在项目中生成一些Library,其实它们就是代理。
第二:虚拟代理,是根据需求创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
例如,浏览器就是运用虚拟代理来优化下载的。
第三:安全代理,用来控制真实对象访问时的权限。
第四:智能指引,是指当调用真实的对象时,代理处理另外一些事。
那今后遇到这些场景,就可以运用代理模式,届时我们只需要分析出那个是代理者,那个是追求者即可完成充代理模式了。
那今天就先来说一说静态代理模式。在大话设计模式中,看到大鸟是这样写的:
一个叫戴笠的男生,想追一个叫娇娇的女生,于是他就想到了一个办法去追求娇娇。就是每次都将自己想要送给娇娇的东西说成他的好朋友卓贾易送的,久而
久之娇娇也就看出来了,就和戴笠在一起了。
然后看完我的感受就是:
interface xxxProxy class Pursuit (卓贾易) class Proxy (戴笠) ----→ ←----- class TheGirl (娇娇)
实际的设计模型就是:
设计一个 代理接口:
然后 追求者类和代理者类都实现 代理接口
然而并不是两个类一模一样,代理者类中实现的 代理接口的方法中 调用的是 追求者实现的代理接口的方法
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。
以struts2中的ActionProxy为例分析:
代理接口:
public interface Proxy{ String execute(); Action getAction(); ActionInvocation getActionInvocation(); }
真实类:
public class Action implements ActionProxy{ public String execute(){} }
代理类:
public class ActionProxy implements Proxy{ private Action action; public String execute(){ return action.execute(); } }
那这样,一个静态的代理模式就基本完成了。但是实际的Struts2中的ActionProxy 用的是DynamicProxy模式,今天呢就暂时先讲一讲静态代理完成Struts2中的ActionProxy吧。
代理模式一般应用场景:
第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
例如,当我在一个web应用中,引用struts框架,那我就需要导入一些jar包,然后会在项目中生成一些Library,其实它们就是代理。
第二:虚拟代理,是根据需求创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
例如,浏览器就是运用虚拟代理来优化下载的。
第三:安全代理,用来控制真实对象访问时的权限。
第四:智能指引,是指当调用真实的对象时,代理处理另外一些事。
那今后遇到这些场景,就可以运用代理模式,届时我们只需要分析出那个是代理者,那个是追求者即可完成充代理模式了。
相关文章推荐
- MyEclipse 10 部署项目时报错,抛出java.lang.NullPointerException异常的解决方法
- Non-resolvable parent POM ['parent.relativePath]
- oc基础第三天-类方法、封装
- Python学习笔记
- ARC的概念和分类的概念
- HDU 1754 I Hate It 线段树
- jquery的post提交---$.post
- Android应用开发之所有动画使用详解
- SQL SERVER 2008 无法附加数据库的解决方法
- Linux 利用管道父子进程间传递数据
- Windows远程桌面技术和SPICE协议概述
- 如何查询注册表的值及 Powershell 应用
- 1044. Shopping in Mars (25)
- 【Java多线程】之四:Life Cycle of Thread
- house robber
- BestCoder Round #49 ($) HDOJ5340 Three Palindromes(暴力)
- seajs使用 - 模块化介绍
- DP问题之最优加法序列
- JQuery函数加载顺序
- Git合并多个Commit