小谈设计模式(8)—代理模式 た 入场券 2023-10-16 16:47 17阅读 0赞 #### 小谈设计模式(8)—代理模式 #### * 专栏介绍 * * 专栏地址 * 专栏介绍 * 代理模式 * * 代理模式角色分析 * * 抽象主题(Subject) * 真实主题(Real Subject) * 代理(Proxy) * 应用场景 * * 远程代理 * 虚拟代理 * 安全代理 * 智能引用代理 * 总结 * Java程序实现 * * 首先,我们定义一个接口 Image,表示图像对象的接口: * 其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象: * 然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象: * 最后,我们可以使用代理对象来访问真实的图像对象,例如: * 输出结果 * 程序分析 * 优缺点分析 * * 优点 * 缺点 * 总结 ## 专栏介绍 ## ### 专栏地址 ### [link][] ### 专栏介绍 ### 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 ![在这里插入图片描述][f7a8d1579c1947e4b015909be4c9a678.png] ## 代理模式 ## 代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对其它对象的访问。代理对象充当了被代理对象的接口,客户端通过代理对象来访问被代理对象,从而实现了对被代理对象的间接访问。 ### 代理模式角色分析 ### #### 抽象主题(Subject) #### 定义了代理对象和被代理对象的共同接口,客户端通过抽象主题来访问被代理对象。 #### 真实主题(Real Subject) #### 实现了抽象主题接口,是被代理对象,代理对象将对其进行间接访问。 #### 代理(Proxy) #### 实现了抽象主题接口,同时包含一个对真实主题的引用,客户端通过代理对象来访问真实主题。 ![在这里插入图片描述][53e4baef1bee4d90805d1302e1211187.png] ### 应用场景 ### #### 远程代理 #### 代理模式常用于网络通信中,例如远程方法调用(RPC)。在分布式系统中,客户端可以通过代理对象来调用远程服务器上的方法,代理对象负责将调用请求发送到远程服务器并返回结果。远程代理隐藏了底层网络通信的细节,使得客户端可以像调用本地方法一样调用远程方法。 #### 虚拟代理 #### 虚拟代理用于在访问对象时进行一些额外的处理。一个常见的例子是延迟加载(Lazy Loading),当一个对象的创建或加载非常耗费资源时,可以使用虚拟代理来推迟对象的创建或加载,直到真正需要访问对象时才进行。例如,在图像加载时,可以使用虚拟代理来延迟加载图像数据,只有当需要显示图像时才真正加载图像数据。 #### 安全代理 #### 安全代理用于控制对对象的访问权限。例如,在一个权限管理系统中,可以使用安全代理来限制只有特定角色的用户才能访问某个对象。代理对象可以在访问真实对象前检查用户的角色,如果用户具有访问权限,则允许访问真实对象,否则拒绝访问。 ![在这里插入图片描述][e65077c831144a30aaf2500028d7b2a5.png] #### 智能引用代理 #### 智能引用代理用于在访问对象时添加一些额外的功能。一个常见的例子是缓存功能,代理对象可以在访问真实对象前先检查缓存中是否存在对应的结果,如果存在则直接返回缓存结果,避免重复计算。另外,还可以使用智能引用代理来实现对象池,代理对象可以管理对象的创建和销毁,并在访问对象时从对象池中获取对象。 #### 总结 #### 代理模式在许多实际应用中都有广泛的应用。通过引入代理对象,可以实现对被代理对象的间接访问,并可以在访问前后做一些额外的处理,如网络通信、延迟加载、权限控制和功能扩展等。代理模式可以提高系统的灵活性和可扩展性,同时也需要权衡系统的复杂性和性能。 ![在这里插入图片描述][2bf29a9356564dd0bee561ecefb72112.png] ### Java程序实现 ### #### 首先,我们定义一个接口 Image,表示图像对象的接口: #### public interface Image { void display(); } #### 其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象: #### public class RealImage implements Image { private String filename; public RealImage(String filename) { this.filename = filename; loadFromDisk(); } private void loadFromDisk() { System.out.println("Loading image from disk: " + filename); } public void display() { System.out.println("Displaying image: " + filename); } } #### 然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象: #### public class ProxyImage implements Image { private String filename; private RealImage realImage; public ProxyImage(String filename) { this.filename = filename; } public void display() { if (realImage == null) { realImage = new RealImage(filename); } realImage.display(); } } #### 最后,我们可以使用代理对象来访问真实的图像对象,例如: #### public class Main { public static void main(String[] args) { Image image = new ProxyImage("test.jpg"); // 第一次访问,会创建真实的图像对象并显示 image.display(); // 第二次访问,直接显示之前创建的真实图像对象 image.display(); } } #### 输出结果 #### Loading image from disk: test.jpg Displaying image: test.jpg Displaying image: test.jpg #### 程序分析 #### 在上面的示例中,ProxyImage 类充当了代理对象,它在访问真实的图像对象之前先进行了一些额外的处理。当第一次访问图像时,代理对象会创建真实的图像对象并显示;当第二次访问图像时,代理对象直接显示之前创建的真实图像对象,避免了重复加载和显示。通过代理对象,我们可以实现对真实对象的间接访问,并在访问前后做一些额外的处理。 ![在这里插入图片描述][3ac52324c1fc48e9b3f20e1f1d4bd78f.png] ### 优缺点分析 ### #### 优点 #### 代理模式可以实现对真实对象的间接访问,可以在访问前后做一些额外的处理,如权限控制、延迟加载、缓存等。 代理对象可以隐藏真实对象的具体实现细节,保护真实对象的安全性。 代理模式可以提高系统的灵活性和可扩展性,可以在不修改真实对象的情况下增加新的代理对象。 代理模式符合单一职责原则,可以将真实对象和代理对象分离,分别负责各自的功能。 #### 缺点 #### 由于引入了代理对象,会增加系统的复杂性,增加了代码的数量和维护的难度。 代理模式会引入额外的开销,因为需要通过代理对象来访问真实对象,可能会导致性能下降。 如果代理对象的创建和销毁过程比较复杂,可能会影响系统的性能。 ![在这里插入图片描述][d63e221c73124560a00fa71fb93da1bd.png] #### 总结 #### 代理模式在许多实际应用中都有广泛的应用,可以提供额外的功能和保护真实对象的安全性。但是,在使用代理模式时需要权衡系统的复杂性和性能,确保代理对象的创建和销毁过程不会影响系统的性能。 [link]: http://t.csdn.cn/B1YXg [f7a8d1579c1947e4b015909be4c9a678.png]: https://img-blog.csdnimg.cn/f7a8d1579c1947e4b015909be4c9a678.png [53e4baef1bee4d90805d1302e1211187.png]: https://img-blog.csdnimg.cn/53e4baef1bee4d90805d1302e1211187.png [e65077c831144a30aaf2500028d7b2a5.png]: https://img-blog.csdnimg.cn/e65077c831144a30aaf2500028d7b2a5.png [2bf29a9356564dd0bee561ecefb72112.png]: https://img-blog.csdnimg.cn/2bf29a9356564dd0bee561ecefb72112.png [3ac52324c1fc48e9b3f20e1f1d4bd78f.png]: https://img-blog.csdnimg.cn/3ac52324c1fc48e9b3f20e1f1d4bd78f.png [d63e221c73124560a00fa71fb93da1bd.png]: https://img-blog.csdnimg.cn/d63e221c73124560a00fa71fb93da1bd.png
相关 小谈设计模式(24)—命令模式 小谈设计模式(24)—命令模式 专栏介绍 专栏地址 专栏介绍 命令模式 角色分析 命令(Comman 心已赠人/ 2024年02月23日 02:27/ 0 赞/ 20 阅读
相关 小谈设计模式(20)—组合模式 小谈设计模式(20)—组合模式 专栏介绍 专栏地址 专栏介绍 组合模式 对象类型 叶节点 ╰半夏微凉°/ 2023年10月16日 17:57/ 0 赞/ 21 阅读
相关 小谈设计模式(19)—备忘录模式 小谈设计模式(19)—备忘录模式 专栏介绍 专栏地址 专栏介绍 备忘录模式 主要角色 发起人(Ori 「爱情、让人受尽委屈。」/ 2023年10月16日 17:47/ 0 赞/ 26 阅读
相关 小谈设计模式(17)—状态模式 小谈设计模式(17)—状态模式 专栏介绍 专栏地址 专栏介绍 状态模式 关键角色 上下文(Conte 青旅半醒/ 2023年10月16日 17:40/ 0 赞/ 22 阅读
相关 小谈设计模式(13)—外观模式 小谈设计模式(13)—外观模式 专栏介绍 专栏地址 专栏介绍 外观模式 主要目的 角色分析 逃离我推掉我的手/ 2023年10月16日 17:12/ 0 赞/ 26 阅读
相关 小谈设计模式(10)—原型模式 小谈设计模式(10)—原型模式 专栏介绍 专栏地址 专栏介绍 原型模式 角色分类 抽象原型(Prot 亦凉/ 2023年10月16日 16:54/ 0 赞/ 24 阅读
相关 小谈设计模式(8)—代理模式 小谈设计模式(8)—代理模式 专栏介绍 专栏地址 专栏介绍 代理模式 代理模式角色分析 抽象主题(S た 入场券/ 2023年10月16日 16:47/ 0 赞/ 18 阅读
相关 小谈设计模式(7)—装饰模式 小谈设计模式(7)—装饰模式 专栏介绍 专栏地址 专栏介绍 装饰模式 装饰模式角色 Componen 以你之姓@/ 2023年10月16日 16:41/ 0 赞/ 13 阅读
相关 小谈设计模式(3)—策略模式 小谈设计模式(3)—策略模式 专栏介绍 专栏地址 专栏介绍 策略模式 主要角色 环境(Context ゞ 浴缸里的玫瑰/ 2023年10月16日 07:26/ 0 赞/ 26 阅读
相关 23种设计模式(8)-代理模式 代理描述 1.生活中: 代理就是一个人或者一个组织代表其他人去做一件事的现实生活中的。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户 绝地灬酷狼/ 2022年06月12日 01:51/ 0 赞/ 192 阅读
还没有评论,来说两句吧...