概念
为其他对象提供一种代理以控制对这个对象的访问。
代码实现
目录结构:
具体代码:
Client类、调用的是代理对象和目标对象,不涉及真实对象
package src.controller; import src.service.Impl.SubjectProxy; import src.service.Impl.Target; /** * @author SHshuo * @data 2021/10/16--8:41 * 策略模式 */ public class Client { public static void main(String[] args) { // 目标对象 Target target = new Target("吕沫竹"); // 代理对象 SubjectProxy subjectProxy = new SubjectProxy(target); subjectProxy.giveDolls(); subjectProxy.giveChocolate(); subjectProxy.giveFlowers(); } }
package src.service.Impl; /** * @author SHshuo * @data 2021/10/16--9:52 * 目标对象 */ public class Target { private String name; public Target(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package src.service.Impl; import src.service.Proxy; /** * @author SHshuo * @data 2021/10/16--8:36 * 真正对象 */ public class RealSubject implements Proxy { private Target target; public RealSubject(Target target){ this.target = target; } @Override public void giveDolls() { System.out.println(target.getName() + ": hshuo送你洋娃娃"); } @Override public void giveFlowers() { System.out.println(target.getName() + ": hshuo送你鲜花"); } @Override public void giveChocolate() { System.out.println(target.getName() + ": hshuo送你巧克力"); } }
总结来讲:就是无论调用代理对象的方法还是构造函数、实则都是调用真实对象的方法和构造函数
package src.service.Impl; import src.service.Proxy; /** * @author SHshuo * @data 2021/10/16--9:48 */ public class SubjectProxy implements Proxy { // 保存一个引用使代理对象可以访问实体 private RealSubject realSubject; // 初始化代理对象相当于初始化真实对象 public SubjectProxy(Target target){ realSubject = new RealSubject(target); } // 提供一个与真实对象接口相同的接口、完全代替 @Override public void giveDolls() { realSubject.giveDolls(); } @Override public void giveFlowers() { realSubject.giveFlowers(); } @Override public void giveChocolate() { realSubject.giveChocolate(); } }
UML类图
应用场景
- 远程代理:就是为了一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(加入一个web引用,引用一个webservice,此时会在项目中生成一个webReference的文件和一些文件夹,这就使得客户端程序调用代理就可以解决远程访问的问题)。
- 虚拟代理:根据需要开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(打开网页,最先看到的是文字、图片是一张一张下载看到的。那些未打开的图片框,就是通过虚拟代理来替代了真实图片,此时代理存储真实对象的路径和尺寸)
- 安全代理:用于控制真实对象访问时的权限。
- 智能指引:是指当调用真实对象时,代理处理另外一些事