java设计模式二

代理模式(Proxy Pattern)是软件工程中常用的一种设计模式,属于结构型模式。它为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理模式可以在不改变对象代码的情况下,为对象添加额外的功能,如延迟初始化、访问控制、日志记录、缓存等。

### 代理模式的角色组成:
1. **抽象主题角色**(Subject):定义了真实对象和代理对象共有的接口。
2. **真实主题角色**(Real Subject):定义了代理所代表的真实对象,实现了与代理相同的接口,并包含了业务逻辑。
3. **代理角色**(Proxy):包含对真实主题的引用,实现了与真实主题相同的接口。代理对象在内部维护真实对象的引用,从而可以操作真实对象;同时,代理对象可以在执行真实对象操作前后添加额外的操作。
4. **客户端角色**(Client):与代理对象交互,客户端并不知道代理对象是代理还是真实对象。

### 代理模式的实现方式:
1. **静态代理**:在程序运行前就已经确定代理关系,代理类和目标类实现相同的接口,代理类中包含目标类的引用,从而可以在内部调用目标类的方法。
2. **动态代理**:在程序运行时,利用反射机制动态创建代理对象。Java 提供了 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口来实现动态代理。

### 案例分析:
以一个租房场景为例,假设有一个房东和一个租客,房东有房子要出租,租客想要租房。为了简化交易过程,引入一个中介(代理)角色。

#### 静态代理实现:
1. 定义一个租房接口 `RentHouse`,包含 `rent` 方法。
2. 实现该接口的房东类 `Landlord`,实现具体的租房逻辑。
3. 创建中介类 `Agent`,也实现 `RentHouse` 接口,并在内部维护 `Landlord` 的引用。`Agent` 的 `rent` 方法在执行租房操作前可以添加一些额外的步骤,如验证租客信息、协商价格等。

#### 动态代理实现:
1. 定义一个租房接口 `RentHouse`,同上。
2. 实现该接口的房东类 `Landlord`,同上。
3. 使用 `java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler` 实现动态代理。创建一个 `InvocationHandler` 实现类,重写 `invoke` 方法,在该方法中调用房东的 `rent` 方法,并添加额外的逻辑。
4. 通过 `Proxy` 类的 `newProxyInstance` 方法动态创建代理对象,并将其作为中介提供给租客。

### 优点:
- 代理模式可以在不修改目标对象的情况下,控制对象的访问,实现懒加载、访问权限控制等功能。
- 可以实现对目标对象的保护和延迟初始化。

### 缺点:
- 可能会引入一些额外的复杂性。
- 有时会导致系统的响应速度变慢,特别是在动态代理中,因为每次调用都需要经过代理对象。

### 应用场景:
- 远程代理:为远程对象提供代理,隐藏对象位于远程地址的事实。
- 虚拟代理:延迟创建开销较大的对象。
- 安全代理:控制访问敏感对象,检查调用者权限。
- 缓存代理:为开销较大的操作结果提供临时存储。

通过上述案例分析,我们可以看到代理模式在实际开发中的应用,以及如何根据不同的需求选择静态代理或动态代理。代理模式是实现访问控制和功能增强的有效手段。

在继续探讨代理模式的案例分析时,我们可以更深入地讨论一些实际应用场景,以及如何将代理模式与其他设计模式结合使用。

### 实际应用场景的深入讨论:

1. **远程代理**:在分布式系统中,远程代理常用于为远程服务提供代理对象。客户端通过远程代理对象与远程服务进行交互,而无需了解网络通信的细节。

2. **延迟初始化**:在应用程序启动时,如果某些对象的初始化很耗时或资源消耗很大,可以使用代理模式延迟这些对象的初始化,直到真正需要它们时才进行。

3. **访问控制**:在需要对对象访问进行权限控制的场景下,代理对象可以检查调用者是否有权访问目标对象,从而实现访问控制。

4. **日志记录**:代理模式可以用于在访问对象的过程中添加日志记录功能,以便于监控和调试。

5. **缓存**:代理模式可以用于实现缓存机制,代理对象可以缓存目标对象的结果,当请求到来时,如果缓存中有结果,则直接返回,否则调用目标对象并更新缓存。

### 代理模式与其他设计模式的结合:

1. **与单例模式结合**:可以为单例对象提供一个代理,以控制对单例对象的访问,同时添加额外的功能,如延迟加载或访问计数。

2. **与工厂模式结合**:代理对象可以由工厂方法创建,这样可以将代理对象的创建与使用解耦,提高系统的灵活性。

3. **与观察者模式结合**:在事件驱动的系统中,代理对象可以作为事件的发布者或订阅者,控制事件的发布和订阅过程。

4. **与适配器模式结合**:代理模式可以用于实现适配器模式,代理对象作为适配器,将目标对象的接口适配为客户端期望的接口。

### 案例分析示例代码:

```java
// 定义租房接口
public interface RentHouse {
    void rent();
}

// 房东类,实现了租房接口
public class Landlord implements RentHouse {
    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

// 中介类,代理类,实现了租房接口
public class Agent implements RentHouse {
    private Landlord landlord;

    public Agent() {
        this.landlord = new Landlord();
    }

    @Override
    public void rent() {
        // 中介可以在这里添加额外的逻辑,如验证租客信息
        System.out.println("中介验证租客信息");
        landlord.rent(); // 调用房东的出租方法
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        RentHouse rentHouse = new Agent();
        rentHouse.rent();
    }
}
```

在这个案例中,`Agent` 类作为 `Landlord` 的代理,控制了对 `Landlord` 的访问,并在出租房子之前添加了额外的验证租客信息的步骤。

通过深入分析代理模式的应用场景和与其他设计模式的结合使用,我们可以更好地理解代理模式的灵活性和强大功能,以及如何在实际项目中有效地应用它。

继续深入探讨代理模式,我们可以讨论一些更高级的话题,包括动态代理的实现细节、代理模式的潜在问题以及如何在现代软件开发中应用代理模式。

### 动态代理的实现细节:

在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理允许在运行时动态创建代理类,而不需要事先编写代理类的代码。

1. **定义接口**:首先,需要定义一个或多个接口,这些接口将由目标对象和代理对象共同实现。

2. **创建InvocationHandler**:实现`InvocationHandler`接口,重写`invoke`方法。在`invoke`方法中,可以定义代理对象在调用目标对象方法前后所执行的额外操作。

3. **创建代理对象**:使用`Proxy`类的`newProxyInstance`方法创建代理对象。这个方法需要传入以下几个参数:
   - `ClassLoader`:定义代理类将要使用的类加载器。
   - `Class<?>[] interfaces`:一个接口数组,表示代理对象需要实现的接口。
   - `InvocationHandler`:代理处理程序,即上面创建的`InvocationHandler`实例。

4. **使用代理对象**:通过代理对象调用方法时,实际会调用`InvocationHandler`的`invoke`方法,并在其中调用目标对象的相应方法。

### 代理模式的潜在问题:

1. **增加系统的复杂性**:引入代理对象可能会使系统变得更加复杂,尤其是在有多个代理对象和多个层次的代理时。

2. **性能问题**:由于代理对象在每次调用时都需要进行额外的处理,可能会对性能产生一定影响,尤其是在对性能要求极高的场景下。

3. **代理对象的维护**:随着业务逻辑的变更,可能需要对代理对象进行相应的更新和维护。

### 现代软件开发中的代理模式应用:

1. **微服务架构**:在微服务架构中,代理模式可以用来实现服务网关,控制对微服务的访问,提供认证、授权、监控和负载均衡等功能。

2. **云原生应用**:在云原生应用中,代理模式可以用于实现服务网格(如Istio),它作为微服务间的代理,提供服务发现、流量管理、安全和可观察性等功能。

3. **面向切面编程(AOP)**:在Spring框架中,AOP功能经常使用代理模式来实现。通过创建目标对象的代理,可以在不修改目标对象代码的情况下,实现如日志记录、事务管理、安全性等横切关注点。

4. **缓存机制**:在需要缓存数据以提高性能的应用中,代理模式可以用来实现缓存逻辑,代理对象负责缓存数据的读写。

5. **资源访问控制**:在需要对资源访问进行细粒度控制的应用中,代理模式可以用来实现访问控制逻辑,代理对象负责检查权限并决定是否允许访问。

通过以上讨论,我们可以看到代理模式在现代软件开发中仍然扮演着重要的角色。它不仅能够提供访问控制和功能增强,还可以与现代软件架构和设计原则相结合,解决实际开发中的各种问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/591750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch分布式train——pytorch.distributed.launch V.S. torchrun

1. 较早的pytorch.distributed.launch python -m torch.distributed.launch --nproc_per_node4 --nnodes1 --node_rank0 train.py --args XXX 参数解析&#xff1a; nnodes&#xff1a;节点&#xff08;主机&#xff09;的数量&#xff0c;通常一个节点对应一个主机 node_rank…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

漏洞挖掘之某厂商OAuth2.0认证缺陷

0x00 前言 文章中的项目地址统一修改为: a.test.com 保护厂商也保护自己 0x01 OAuth2.0 经常出现的地方 1&#xff1a;网站登录处 2&#xff1a;社交帐号绑定处 0x02 某厂商绑定微博请求包 0x02.1 请求包1&#xff1a; Request: GET https://www.a.test.com/users/auth/weibo?…

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战&#xff0c;尤其对于大规模运行的集群来说可谓至关重要。如果处理不好&#xff0c;可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要&#xff0c;说HDFS 存储小文件…

Python字符串常用方法(全网最细,仅此一份)

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 👉Python从入门到精通 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python180G全栈视频教程以及Python相关电子书合集 😊私信未回可以加V:hacker0327 备注P…

Word文件后缀

Word文件后缀 .docx文件为Microsoft Word文档后缀名&#xff0c;基于XML文件格式 .dotm为Word启用了宏的模板 .dotx为Word模板 .doc为Word97-2003文档&#xff0c;二进制文件格式 参考链接 Word、Excel 和 PowerPoint 的文件格式参考 Learn Microsoft

u盘格式化后电脑读不出来怎么办?u盘格式化的东西还能恢复吗

随着科技的快速发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;有时我们可能会遇到U盘格式化后电脑无法读取的情况&#xff0c;或是误格式化导致重要数据丢失。面对这些问题&#xff0c;我们该如何应对&#xff1f;本文将为您详细解答…

C语言 main( ) 函数的指针数组形参是怎么回事?

一、问题 在使⽤⼀些开发⼯具⽣成C语⾔⽂件时&#xff0c;主函数 mian( ) 中会有参数&#xff0c;这个参数到底是怎么回事⼉呢&#xff1f; 二、解答 mian( ) 称为主函数&#xff0c;是所有程序运⾏的⼊口。 mian( ) 函数是由系统调⽤的&#xff0c;当处于操作命令状态下&…

解锁学术语言:掌握论文释义工具的高效使用技巧

研究论文是一份书面文件&#xff0c;其中包括对特定主题的论点、想法和观点的概述。释义至关重要&#xff0c;因为它可以为您的工作增添意义和价值。教育释义的核心目的是增加你的写作的价值&#xff0c;同时考虑其他作家的观点和发现&#xff0c;并建立与你的主题的相关性。通…

恶补《操作系统》5_1——王道学习笔记

5设备管理 5.1_1 I-O设备的概念和分类 1、什么是I-O设备 输入/输出&#xff1a;I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 2、按使用特性分类 人机交互的外部设备存储设备网络通信设备 3、…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

计算机的翻译(编译和链接)过程

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;1.翻译环境和运行环境&#xff1…

AI大模型探索之路-训练篇12:语言模型Transformer库-Datasets组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

深入理解 LinkedList 及底层源码分析

LinkedList 是基于链表结构的一种 List&#xff0c;在分析 LinkedList 源码前我们先对对链表结构做一个简单的了解。 一、链表的概念 链表是由一系列非连续的节点组成的存储结构&#xff0c;简单分下类的话&#xff0c;链表又分为_单向链表和双向链表&#xff0c;而单向 / 双…

函数之对决!!:数学函数 VS C++函数

前言 有人问过我&#xff0c;C里的函数是否跟我们数学里的函数一样&#xff1f;于是&#xff0c;我就写下了这篇文章。 一、数学函数 1、一次函数 一次函数&#xff0c;也称为线性函数&#xff0c;是数学中函数的一种&#xff0c;通常表示为ykxb&#xff08;其中k和b是常数&am…

HR面试测评,招聘市场部主管的人才测评方案

人才测评有时候也叫岗位胜任力测评&#xff0c;也有叫综合素质或综合能力测评&#xff0c;其目的都是为了寻找人岗匹配&#xff0c;找到适合这个岗位的人才&#xff0c;为企业创造最大化的价值。企业是一个平台&#xff0c;也是个人实现自我价值的途径&#xff0c;实际上人才测…

3GPP官网下载协议步骤

1.打开官网 https://www.3gpp.org/ 2.点击 3.在界面选择要找的series&#xff0c;跳转到查找界面 以V2X通信协议为例&#xff0c;论文中通常会看到许多应用&#xff1a; [7] “Study on evaluation methodology of new Vehicle-to-Everything (V2X) use cases for LTE and NR…

Mac 更新 Homebrew软件包时提示 zsh: command not found: brew 错误

问题 通过Mac电脑更新Homebrew软件包时出现如下错误&#xff1a; xxxxxxxpiaodeMacBook-Pro ~ % brew update zsh: command not found: brew解决方案 在命令行输入如下指令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/H…

基于免疫粒子群算法的考虑负荷需求相应的热电联供系统优化调度(MATLAB实现)

1.研究背景 随着“双碳”战略的提出&#xff0c;各种分布式能源的开发和利用收到越来越多的重视。冷热电联供(Combined Cooling Heating and Power, CCHP)系统在发电的同时可以将燃气轮机产生的废热用于制热或制冷&#xff0c;实现能量的梯级利用&#xff0c;并减少系统的污染气…
最新文章