现在的位置: 首页 > 综合 > 正文

java设计模式9:Proxy

2017年12月07日 ⁄ 综合 ⁄ 共 1474字 ⁄ 字号 评论关闭

代理模式也是一种通信接间化的一种思想体现。同样有这种思想的还有适配器模式和装饰模式。

1、类适配器和对象适配器模式简图

$XH6~TZ$L{M9A{}MX`[WFIT

2、装饰模式简图

X3LZF81A]S2XQN9K4%KL46L

3、所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。简略图如下:

image

远程代理

虚拟代理

Copy-on-Write代理

保护代理

Cache代理

防火墙代理

同步化代理

智能引用代理

代理模式的结构
1、抽象主体:声明了真实主体和代理主体的共同接口,这样一来在任何可以使用真实主体的地方都可以使用代理主题。
2、代理主体:代理主体角色内部含有对真实主体的引用,从而可以在任何时候操作真实主体对象;代理主体角色提供一个与真实主体角色相同的接口。以便可以在任何时候都可以替代真实主体;控制对真实主体的引用,负责在需要的时候创建真实主体对象(和删除真实主体对象);代理角色通常在将客户端调用传递给真实的主体之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主体对象。
3、真实主体:定义了代理角色所代表的真实对象。

示意性实现:

image

package com.javapatterns.proxy;

 

public class Client

{

      private static Subject subject;

 

    static public void main(String[] args)

    { 

        subject = new ProxySubject();

        subject.request();

    }

}

 

 

package com.javapatterns.proxy;

 

abstract public class Subject

{

    abstract public void request();

}

 

 

package com.javapatterns.proxy;

 

public class RealSubject extends Subject 

{

    public RealSubject()

    { 

    }

    

    public void request()

    { 

        System.out.println("From real subject.");

    }

}

 

 

package com.javapatterns.proxy;

 

public class ProxySubject extends Subject 

{

    /**

     * @uml.property  name="realSubject"

     * @uml.associationEnd  

     */

    private RealSubject realSubject;

    

    public ProxySubject()

    {

    }

    

    public void request()

    {

        preRequest();

 

        if( realSubject == null )

        {

            realSubject = new RealSubject();

        }

 

        realSubject.request();

 

        postRequest();

    }

 

    private void preRequest()

    {

        //something you want to do before requesting

    }

 

    private void postRequest()

    {

        //something you want to do after requesting

    }

}

 

从上面的代理的示意性源代码可以看出:
1、首先,代理主体并不改变主体的接口,因为模式的用意是不让客户端感觉到代理的存在。
2、其次,代理使用委派将客户端的调用委派给真实的主体对象。换言之,代理主体起到的是一个传递请求的作用。
3、最后,代理主体在传递请求之前和之后都可以执行特定的操作,而不是单纯传递请求。

对象图如下图所示:
image

抱歉!评论已关闭.