六种常用的设计模式java实现(五)代理模式

来源:互联网 发布:新星星知我心 编辑:程序博客网 时间:2024/06/01 22:25

代理这个概念,大家应该不陌生,像spring中的动态代理和jdk代理,以及webservice中都会用到代理模式。顾名思义,就是通过代理的方式完成一些事。

一、基本概念

为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务

二、结构

●  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
●  目标对象角色:定义了代理对象所代表的目标对象。
●  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

三、代码实现

首先,准备一个抽象对象角色:

package org.wuqiong.designpattern.proxypattern;/** * ClassName:AbstractObject <br/> * Function: 抽象对象角色. <br/> * Date:     2016年1月29日 下午4:17:04 <br/> * @author   qiyongkang * @version   * @since    JDK 1.6 * @see       */public abstract class AbstractObject {    //操作    public abstract void operation();}

然后,准备一个目标对象角色:

package org.wuqiong.designpattern.proxypattern;/** * ClassName:RealObject <br/> * Function: 目标对象角色. <br/> * Date:     2016年1月29日 下午4:17:56 <br/> * @author   qiyongkang * @version   * @since    JDK 1.6 * @see       */public class RealObject extends AbstractObject {    @Override    public void operation() {        //一些操作        System.out.println("一些操作");    }}

接下来,再准备一个代理对象角色:

/** * ClassName:ProxyObject <br/> * Function: TODO ADD FUNCTION. <br/> * Reason: TODO ADD REASON. <br/> * Date: 2016年1月29日 下午4:19:47 <br/> *  * @author qiyongkang * @version * @since JDK 1.6 * @see */public class ProxyObject extends AbstractObject {    RealObject realObject = new RealObject();    @Override    public void operation() {        // 调用目标对象之前可以做相关操作        System.out.println("before");        realObject.operation();        // 调用目标对象之后可以做相关操作        System.out.println("after");    }}

最后,准备一个客户端:

package org.wuqiong.designpattern.proxypattern;/** * ClassName:Client <br/> * Function: TODO ADD FUNCTION. <br/> * Reason:   TODO ADD REASON. <br/> * Date:     2016年1月29日 下午4:21:53 <br/> * @author   qiyongkang * @version   * @since    JDK 1.6 * @see       */public class Client {    public static void main(String[] args) {        AbstractObject obj = new ProxyObject();        obj.operation();    }}

通过以上代码分析,可以看出其实目标对象和代理对象做的核心事是一样的,只不过代理对象还可以完成额外的任务,同时还可以把目标对象给隐藏起来。
其实,在spring中的面向切面编程,用到的就是代理模式。
好了,代理模式就讲到这儿了。

0 0
原创粉丝点击