23种设计模式之代理模式2
2015-07-12 17:00
337 查看
代理模式是一个使用率非常高的模式,其定义如下:
为其他对象提供一种代理以控制对这个对象的访问。
代理模式也叫委托模式。它是一个基本设计技巧。许多其他的模式比如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。在一些著名的开源软件中经常能看到它的身影,如Struts2的Form元素映射就采用的代理模式,准确的说是动态代理模式,我们首先看一下三个角色的定义:
Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
RealSubject具体主题角色
也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。
Proxy代理主题角色
也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在现实主题角色处理完毕前后做预处理和善后处理工作。
我们首先来看看Subject抽象主题类的代码:
在接口中我们定义了一个request方法作为方法的代表,RealSubject对它进行实现,代码如下:
真实主题类:
也就是在代理类的构造函数中传递被代理者,例如我们可以在代理类Proxy中增加构造函数。
代理的构造函数
你要的代理谁就产生代理的实例,然后把被代理者传递进来。
代理模式的优点:
~职责清晰
真实的角色就是实现实际的业务逻辑,不用关系其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
~高扩展性
具体主题角色是随时都发生变化的,只要实现接口,不用管他何时变化了,我们的代理类完全就可以在不做任何修改的情况下使用。
~智能化
在下面的动态代理中你会看到代理的智能化。
为其他对象提供一种代理以控制对这个对象的访问。
代理模式也叫委托模式。它是一个基本设计技巧。许多其他的模式比如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。在一些著名的开源软件中经常能看到它的身影,如Struts2的Form元素映射就采用的代理模式,准确的说是动态代理模式,我们首先看一下三个角色的定义:
Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
RealSubject具体主题角色
也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。
Proxy代理主题角色
也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在现实主题角色处理完毕前后做预处理和善后处理工作。
我们首先来看看Subject抽象主题类的代码:
public interface Subject{ public void request(); }
在接口中我们定义了一个request方法作为方法的代表,RealSubject对它进行实现,代码如下:
真实主题类:
public class RealSubject implements Subject{ public void request(){ //业务逻辑处理 } }RealSubject是一个正常的业务实现类,代理模式的核心就在代理类上,代码如下:
public class Proxy implements Subject{ private Subject subject = null; public Proxy(){ this.subject = new Proxy(); } public Proxy(Object... objects){ } public void request(){ this.before(); this.subject.request(); this.after(); } private void before(){//预处理 //do something } private void after(){//善后处理 //do something } }一个代理类可以代理多个委托者或者被代理者,因此一个代理类具体代理哪个真实主题角色,由场景类决定。当然,最简单的情况就是一个主题类和一个代理类,这是最简洁的代理模式。通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个实现类由高层模块来决定。
也就是在代理类的构造函数中传递被代理者,例如我们可以在代理类Proxy中增加构造函数。
代理的构造函数
public Proxy(Subject _subject){ this.subject = _subject; }
你要的代理谁就产生代理的实例,然后把被代理者传递进来。
代理模式的优点:
~职责清晰
真实的角色就是实现实际的业务逻辑,不用关系其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
~高扩展性
具体主题角色是随时都发生变化的,只要实现接口,不用管他何时变化了,我们的代理类完全就可以在不做任何修改的情况下使用。
~智能化
在下面的动态代理中你会看到代理的智能化。
相关文章推荐
- IDEA下JAVA 调用GDAL读写tif文件
- 【版本控制】如何从github 上获取源码
- AWK 简明教程
- android系统的启动流程
- Java的接口
- OC本学习笔记Foundatio框架集
- Navicat Premium11.0.16 mac 破解
- [开发工具]_[VS2010]_[vs2010的一个bug-使用stringstream时出现]
- [Android随笔]Android关于Crash的处理
- LayoutInflater的使用
- poj1861解题报告
- Python下opencv使用笔记(七)(图像梯度与边缘检测)
- [开发工具]_[VS2010]_[vs2010的一个bug-使用stringstream时出现]
- 学习笔记_监听器
- CSS3学习(一) css基础补充
- 使用Gitblit在Windows平台上安装与配置Git Server
- Java的访问控制符
- Html 语法学习笔记二
- Html 语法学习笔记二
- file_operation结构体详解