本文介绍: 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。在该模式中,代理类代表了一个真实主题(Real Subject),并提供了与真实主题相同的接口,以便在客户端调用时可以透明地替代真实对象。:追女孩~ 小明喜欢软软,但是小明很害羞,希望通过小硬送礼物给软软。如果用代码实现这个流程,如何实现呢?代码结构图。
设计模式-代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。在该模式中,代理类代表了一个真实主题(Real Subject),并提供了与真实主题相同的接口,以便在客户端调用时可以透明地替代真实对象。
抽象提取理论:
- 抽象主题
- 真实主题
- 代理
代码需求:追女孩~ 小明喜欢软软,但是小明很害羞,希望通过小硬送礼物给软软。如果用代码实现这个流程,如何实现呢?
代理实现
代码结构图
- 代理和追求者共拥有的方法:送礼物
- 代理所表示的真实实体:追求者-小明
- 代理类:小硬
- 客户端:软软
代码实现:
/**
* 送礼物接口
*/
public interface IGift {
/**
* 送洋娃娃
*/
void giveDolls();
/**
* 送鲜花
*/
void giveFlowers();
/**
* 送巧克力
*/
void giveChocolate();
}
/**
* 追求者-小明
*/
public class Suitor implements IGift{
/**
* 追求的对象
*/
private ThePursued thePursued;
public Suitor (ThePursued thePursued){
this.thePursued = thePursued;
}
@Override
public void giveDolls() {
System.out.println(thePursued.getName() + "我给你送洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(thePursued.getName() + "我给你送鲜花");
}
@Override
public void giveChocolate() {
System.out.println(thePursued.getName() + "我给你送巧克力");
}
}
/**
* 被追求者-软软
*/
public class ThePursued {
private String name;
public ThePursued(String name){
this.name = name;
}
public String getName(){
return name;
}
}
/**
* 代理-小硬
* 同时有追求者和被追求者信息
*/
public class Proxy implements IGift{
// 追求者
private Suitor suitor;
/**
* 获取被追求者信息
*/
public Proxy(ThePursued thePursued){
suitor = new Suitor(thePursued);
}
@Override
public void giveDolls() {
suitor.giveDolls();
}
@Override
public void giveFlowers() {
suitor.giveFlowers();
}
@Override
public void giveChocolate() {
suitor.giveChocolate();
}
}
/**
* 客户端-测试
*/
public class ProxyDemo {
public static void main(String[] args) {
// 被追求者
ThePursued thePursued = new ThePursued("软软");
// 代理
Proxy proxy = new Proxy(thePursued);
proxy.giveChocolate();
proxy.giveDolls();
proxy.giveFlowers();
}
}
输出结果:
Connected to the target VM, address: '127.0.0.1:30065', transport: 'socket'
软软我给你送巧克力
软软我给你送洋娃娃
软软我给你送鲜花
Disconnected from the target VM, address: '127.0.0.1:30065', transport: 'socket'
实用场景举例:
- 远程代理(Remote Proxy):
- 在分布式系统中,客户端可能需要调用远程服务器上的服务或对象。远程代理为本地客户端提供一个接口,使得客户端像调用本地方法一样调用远程对象的方法,而网络通信、数据序列化和反序列化等细节由代理类处理。
- 虚拟代理(Virtual Proxy):
- 当加载资源耗时较长时,如大图片、视频文件的预加载。虚拟代理可以在图片未完全加载前显示占位符,当真实图片加载完毕后立即替换占位符。
- 在Web应用中,可以使用懒加载技术,只有当用户滚动到可视区域时才动态加载内容。
- 缓存代理(Caching Proxy):
- 缓存代理在访问数据库或其他昂贵计算结果时非常有用。它会检查请求是否已经在缓存中,如果存在则直接返回缓存结果,否则才去查询真实对象并更新缓存。
- 保护代理(Protection Proxy):
- 控制对敏感操作或受保护对象的访问权限,例如,在软件授权系统中,可以通过代理控制对特定功能的访问,仅允许经过身份验证和授权的用户执行操作。
- 日志记录代理(Logging Proxy):
- 在方法调用前后自动添加日志记录,方便追踪系统的运行状态和问题定位,同时不污染业务逻辑代码。
- 同步代理(Synchronization Proxy):
- 当多个线程需要访问同一资源时,同步代理可以确保资源以线程安全的方式被访问。
- 智能引用代理(Smart Reference Proxy):
)**:- 在方法调用前后自动添加日志记录,方便追踪系统的运行状态和问题定位,同时不污染业务逻辑代码。
- 同步代理(Synchronization Proxy):
- 当多个线程需要访问同一资源时,同步代理可以确保资源以线程安全的方式被访问。
- 智能引用代理(Smart Reference Proxy):
- 对象的生命周期管理,例如Java中的弱引用代理,它可以作为对象的一个轻量级引用,当该引用指向的对象不再有强引用时,垃圾回收器可以回收该对象。
原文地址:https://blog.csdn.net/m0_62649352/article/details/135665995
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_60460.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。