设计模式 —— 代理模式(Proxy Pattern)
来源:互联网 发布:js删除div内容 编辑:程序博客网 时间:2024/06/16 13: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 为对象添加一个或多个功能,而代理则控制对对象的访问。
- 设计模式(13)——代理模式(Proxy Pattern)
- 设计模式 —— 代理模式(Proxy Pattern)
- Java设计模式——代理模式(PROXY PATTERN)
- 【三】设计模式——代理模式(Proxy Pattern)
- Java设计模式——代理模式(Proxy Pattern)
- 【设计模式】结构性模式—— 代理模式(Proxy Pattern)
- 设计模式-代理模式(Proxy Pattern)
- 设计模式 -- 代理模式(Proxy Pattern)
- 【设计模式】代理模式(Proxy Pattern)
- 设计模式—静态代理模式和动态代理模式(Proxy Pattern)
- 设计模式——代理模式【Proxy Pattern】
- 设计模式——代理模式(Proxy Pattern)
- java设计模式——代理模式(Proxy Pattern)
- Java设计模式——代理模式(Proxy Pattern)
- 设计模式学习—代理模式(Proxy Design Pattern)
- Proxy Design Pattern(代理设计模式)
- 我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
- 我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
- 错误:-bash: phpstudy: command not found(linux phpStudy)
- Hive之——metastore三种配置方式
- AndroidStudio配色方案和Sexy Editor插件
- Java NIO系列教程(四) Scatter/Gather
- java 双层for的break continue代码精简
- 设计模式 —— 代理模式(Proxy Pattern)
- css3多列
- 我的第一篇原创博客之开篇
- uml那些事——几类重要的图
- $.each()
- Mysql 大数据量高并发的数据库优化
- spring关于bean的配置
- RGB图片转换为灰度图批处理
- 利用快排找中位数【未完成】