设计模式 —— 代理模式(Proxy Pattern)

原创 2016年06月02日 10:11:26

代理模式(Proxy Pattern)

概念:

定义:代理模式 为另一个对象提供一个替身或占位符以控制这个对象的访问。

代理模式很好理解,在生活中也很常见。举个简单的例子,我们自己能做很多事情(动作),比如写作业,出去玩等。当我们和父母在家的时候,同学叫我们出去玩,父母先收到消息,然后忽略掉出去玩的信息。如果同学叫我们去写作业,父母接收到后在传达给我们。此时父母就是我们的代理,并且对我们 资源 进行了一定的控制,这是代理模式的一种:保护代理

使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是 远程的对象创建开销大的对象需要安全控制 的对象。

常见的代理模式有 3 种:

远程代理:控制访问远程对象。

虚拟代理:控制访问创建开销大的资源。

保护代理:基于权限控制对资源的访问。


组成:

代理模式

Subject(接口):Proxy 和 RealSubject 对象都实现 Subject 接口,这使得任何客户端都可以像处理 Proxy 一样处理 RealSubject。

Proxy(代理对象):代理对象持有 RealSubject(真实对象)的引用,必要时可以将请求转发给 Subject。

RealSubject(真实对象):真实对象通常是真正做事情的对象,Proxy 可以控制对 RealSubject 对象的访问。


例子:

现在有一位明星,他有很多个人信息,而他的经纪人就是他的代理。经纪人会隐藏很多明星的信息,如年龄、身高等。

代理模式例子

接口类:包含明星和代理都要实现的方法。

public interface PersonBean {
    String getName();
    String getInteresters();
    int getAge();
    double getHeight();

    void setName(String name);
    void setInteresters(String interesters);
    void setAge(int age);
    void setHeight(int height);
}

明星类:

public class Star implements PersonBean {
    private String name;
    private String interesters;
    private int age;
    private double height;

    public String getName() {
        return name;
    }

    public String getInteresters() {
        return interesters;
    }

    public int getAge() {
        return age;
    }

    public double getHeight() {
        return height;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setInteresters(String interesters) {
        this.interesters = interesters;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

经纪人类:

public class ProxyPeoson implements PersonBean{
    private PersonBean star;

    public ProxyPeoson(PersonBean star) {
        this.star = star;
    }

    public String getName() {
        return star.getName();
    }

    public String getInteresters() {
        return star.getInteresters();
    }
    //修改明星的年龄
    public int getAge() {
        return star.getAge()-5;
    }
    //修改明星的身高
    public double getHeight() {
        return star.getHeight()+10;
    }

    public void setName(String name) {
        star.setName(name);
    }

    public void setInteresters(String interesters) {
        star.setInteresters(interesters);
    }

    public void setAge(int age) {
        star.setAge(age);
    }

    public void setHeight(int height) {
        star.setHeight(height);
    }
}

测试类:

public class ProxyTest {
    public static void main(String[] args) {
        Star star = new Star();
        ProxyPeoson proxyPeoson = new ProxyPeoson(star);
        star.setName("Tom");
        star.setInteresters("basketball");
        star.setAge(32);
        star.setHeight(174);
        //明星姓名和兴趣不会变。
        System.out.println("Star Name:" + proxyPeoson.getName());
        //经纪人会隐藏明星的年龄,比实际年龄小 5 岁
        System.out.println("Star Age:" + proxyPeoson.getAge());
        //经纪人会应藏明星的身高,比实际身高高 10 cm
        System.out.println("Star Height:" + proxyPeoson.getHeight());
        System.out.println("Star Intersters:" + proxyPeoson.getInteresters());
    }
}

代理模式

其实上面例子是 保护代理 的演示,比如明星某些隐私不能让大众知道,那么经纪人就会拒绝告知。
如果上面的例子改为:明星不在时,他的一切事务全由经纪人代理,如果真的某些事情必须明星出面在找到他(实例化),这就是所谓的 虚拟代理直到真正需要一个对象时才创建它
如果上面的例子改为:明星不在,但通过网络和经纪人取得联系,互相通信事务,经纪人遇到情况会通过网络转发给明星,明星执行完后返回给经济人,这就是所谓的 远程代理调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回到代理,再由代理将结果转给客户


适用场景:

  • 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中。
  • 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
  • 保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

优缺点:

优点:

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

缺点:

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

与其它模式区别:

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

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

版权声明:free, open, share

设计模式总结之Proxy Pattern(代理模式)

为其他对象提供一种代理以控制对这个对象的访问。
  • cooldragon
  • cooldragon
  • 2016年08月11日 00:50
  • 1240

设计模式:代理模式(Proxy)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。 代理模式中的角色: 抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对...
  • u013256816
  • u013256816
  • 2016年03月29日 21:38
  • 4359

设计模式(结构型)之代理模式(Proxy Pattern)

代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式...
  • yanbober
  • yanbober
  • 2015年05月04日 18:48
  • 5680

JAVA设计模式之 代理模式【Proxy Pattern】

一、概述     给某一个对象提供一个代理,并由代理对象来完成对原对象的访问。代理模式是一种对象结构型模式。 二、适用场景     当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代...
  • l416112167
  • l416112167
  • 2015年01月10日 16:15
  • 2795

【设计模式】学习笔记15:代理模式(Proxy Pattern)

本笔记内容: 1. JAVA远程代理调用(RMI) 2. 代理模式 走进代理模式 在上一篇的状态模式中,我们实现了一个糖果机GumballMachine, 客户通过投币可以买到糖果. 现在设想这...
  • shuangde800
  • shuangde800
  • 2013年08月26日 00:22
  • 4077

Design Pattern: Proxy 模式

学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/10472999; 文章摘自: http://www.ri...
  • wdzxl198
  • wdzxl198
  • 2013年08月28日 21:00
  • 848

设计模式中代理(proxy)与委托(delegate)的语义区别

2014年10月17日 05:39:19      今天经浩哥与柏哥的解释,自己终于掌握了proxy与delegete语义的区别:      proxy :译为代理, 被代理方(B)与代理方(A)...
  • jince007
  • jince007
  • 2014年10月17日 06:50
  • 2222

最常用的设计模式---代理模式(C++实现)

代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • lh844386434
  • lh844386434
  • 2014年01月09日 17:23
  • 2046

代理模式(Proxy Pattern)- 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 代理模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 ...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:34
  • 6508

设计模式——代理模式(Proxy Pattern)

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。   UML图:...
  • tanlon_0308
  • tanlon_0308
  • 2014年10月24日 13:43
  • 378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 —— 代理模式(Proxy Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)