码迷,mamicode.com
首页 > 其他好文 > 详细

Structual设计--Proxy 模式

时间:2015-05-28 10:58:15      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:代理   模式   

1.意图

为其他对象提供一种代理以控制对这个对象的访问。

2.别名

Surrogate

3.动机

对一个对象进行访问控制的一个愿意是为了只有在我们确实需要这个对象时才对他进行创建和初始化。譬如手机上加载图片,每一个屏幕的大小是有限定的,我们无需每次把所有图片都加载上,只有在需要展示的时候才对图片进行创建和初始化。

4.适用性

在需要用比较通用和复杂的对象指针代理简单的指针的时候,使用Proxy。下面是一些可以使用Proxy模式常见的情况:

  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
  • 虚代表(Virtual Proxy)根据需要创建开销很大的对象。譬如手机上加载图片
  • 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
  • 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行了一些附加操作。他的典型用途包括:

  • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。

  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

5.结构

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候展示一些对象,无需实例化非常多的对象,尤其是加载一些非常费内存的对象。先来看看关系图:
技术分享
其中Sourceable为公共接口,Source为实际对象操作,创建Proxy代理类,当Client调用是时候,只需要与Proxy进行交互。

6.代码示例

代理模式代码:
Source类

public class Source implements Sourceable {

    @Override
    public void method() {
        System.out.println("the original method!");
    }
}

Sourceable类

public interface Sourceable {
    public void method();
}

代理Proxy类

public class Proxy implements Sourceable {

    private Source source;
    public Proxy(){
        super();
        this.source = new Source();
    }
    @Override
    public void method() {
        before();
        source.method();
        atfer();
    }
    private void atfer() {
        System.out.println("after proxy!");
    }
    private void before() {
        System.out.println("before proxy!");
    }
}

Proxy类对Source进行了扩充操作,下面是测试类:

public class ProxyTest {

    public static void main(String[] args) {
        Sourceable source = new Proxy();
        source.method();
    }

}

输出:
before proxy!
the original method!
after proxy!

代理模式的应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护,这里没有举例加载手机图片(虚代表)左右,但是是很关键的!

7.相关模式

Adapter模式:适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作。因此,它的接口实际上可能只是实体接口的一个子集。

Decorator模式:尽管decorator的实现部分与代理相似,但decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

代理的实现与decorator实现类似,但是在相似的程度上有所区别。Protection Proxy的实现可能与decorator的实现差不多。另一方面,Remote Proxy不包含对实体的直接引用,而只是一个间接引用,如“主机:ID,主机上的局部地址”。Virtual Proxy开始的时候使用一个间接引用,例如一个文件名。但最终将获取并使用一个直接引用。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539

Structual设计--Proxy 模式

标签:代理   模式   

原文地址:http://blog.csdn.net/feiyangxiaomi/article/details/46117495

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!