Java20个主要开发模式之(代理模式)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java20个主要开发模式之(代理模式)

一.代理模式的发展

1.代理模式的背景

在小编我搜索许多主流网站无一将代理模式及的出现要:追溯到面向对象设计原则中的单一职责原则和开闭原则。

1.1单一职责原则:

单一职责原则要求一个类只负责一项职责,即一个类应该有且只有一个引起它变化的原因。当一个类承担的功能过多时,它的职责就会变得复杂,不易于理解、维护和扩展。代理模式能够通过引入代理对象来将职责进行分离,让每个对象只负责特定的功能,符合单一职责原则的要求

1.2开闭原则:

开闭原则要求软件实体(类、模块、函数等)对扩展开放,对修改关闭。如果直接修改一个类的代码来实现额外的功能,在面对频繁变化的需求时,代码维护成本将会很高。代理模式可以通过引入代理对象,使得客户端只依赖于代理接口,而不直接依赖于具体的目标对象,从而在不修改客户端代码的情况下扩展功能。这种通过增加代理来实现开闭原则的思想体现了代理模式的重要价值

2.代理模式可以解决的背景问题

2.1远程代理:

当目标对象位于不同的地址空间,无法直接访问时,使用远程代理可以在客户端和目标对象之间建立通信桥梁。客户端通过代理对象发送请求,代理对象负责将请求传递给远程目标对象,并将结果返回给客户端。

2.1虚拟代理:

当创建一个对象的成本很高时,可以使用虚拟代理来控制对象的创建和初始化。虚拟代理在真正需要对象时才创建它,可以延迟对象的加载时间,提高系统的性能和资源利用率。在图像加载、大文本文件处理等场景下,虚拟代理具有较大的优势。

2.3安全代理:

安全代理用于控制对目标对象的访问权限,在调用目标对象方法前进行权限检查和验证。通过安全代理,可以实现对目标对象的保护,防止未授权的访问

总而言之,代理模式的背景可以归结为通过引入代理对象来解决单一职责原则、开闭原则以及特定功能需求的问题,提供了更好的灵活性、可维护性和可扩展性。

3.在企业开发过程中代理模式出现在哪些地方

3.1数据库访问代理:

在企业应用中,数据库操作是非常常见的需求。使用代理模式可以实现对数据库的访问控制、事务管理、缓存等功能。代理对象可以在执行数据库操作前后进行额外的逻辑处理,比如权限验证、异常处理等,从而增强了系统的安全性和可靠性。

3.2远程服务代理:

当企业应用需要与其他系统进行远程通信时,可以使用代理模式来实现远程服务的访问和调用。代理对象充当了客户端与远程服务之间的中介,通过代理对象进行网络通信、数据转换等操作,隐藏了底层的网络细节,使得远程服务的使用变得更加方便和安全。

3.3日志记录代理:

在企业应用中,日志记录是必不可少的功能。使用代理模式,可以在目标对象的方法执行前后添加日志记录的逻辑,例如记录方法的入参、返回值、执行时间等信息。代理对象可以集中管理日志的格式、级别以及存储位置,提高日志记录的效率和灵活性。

3.4安全代理:

在企业应用中,数据安全是一个重要的考虑因素。通过使用代理模式,可以在目标对象的方法执行前进行身份验证、权限控制等操作,保护数据免受未经授权的访问。代理对象可以在不改变目标对象代码的情况下增加额外的安全层,提高系统的安全性

3.5缓存代理:

当企业应用需要频繁地访问某个资源或计算复杂的结果时,可以使用代理模式来实现缓存功能。代理对象可以在第一次访问资源或计算结果时将其缓存起来,并在后续请求中直接返回缓存的结果,从而提高系统的性能和响应速度。

当然这只是小编总结:代理模式在企业开发过程中的一些常见应用场景,实际上代理模式在很多领域都有广泛的应用,帮助开发人员实现灵活、可维护和可扩展的系统设计

4.使用代理模式好处(没有优点怎么会有人使用?)

1. 隐藏真实对象的实现细节:代理可以隐藏真实对象的实现细节,这样客户端无需了解真实对象的具体实现,只需要与代理对象进行交互即可。

2. 实现对象的延迟加载:代理可以延迟对真实对象的实例化,只有当真正需要使用真实对象时才进行实例化操作,从而节省系统资源。

3. 控制对真实对象的访问权限:代理可以在客户端访问真实对象之前进行权限控制,根据需要拒绝或允许客户端的访问请求。

4. 实现远程访问的透明化:代理模式可以将真实对象和客户端分离在不同的地址空间,从而支持跨越网络进行远程访问,而客户端无需关心这种远程访问的具体细节。

5. 对真实对象进行增强操作:代理对象可以在调用真实对象的方法之前或之后执行一些额外的操作,例如权限验证、缓存处理、日志记录等。

总结来说,代理模式可以提供一种灵活、可控的访问方式,对真实对象进行了封装和增强,使得系统更加安全、高效,同时降低了系统的耦合度。

二.实例应用代理模式,在Java开发中(在这里小编使用的开发工具为IDEA)

在这里小编以购物为例:

假设有一个电商平台,用户可以在该平台上购买商品。为了提高用户体验,平台引入了代理模式,并结合 Maven 进行项目管理。

1.创建接口: 首先,在项目中创建一个ShopService接口,定义购买商品的方法

public interface ShopService {
    void buyItem(String item, int quantity);
}

2.创建真实主题类: 实现上述接口的真实主题类RealShopService,用于实际处理购买商品的逻辑

public class RealShopService implements ShopService {
    @Override
    public void buyItem(String item, int quantity) {
        // 处理购买商品的实现逻辑
        // ...
        System.out.println(quantity + "个" + item + "已购买成功");
    }
}

3.创建代理类: 创建代理类ProxyShopService,实现ShopService接口,并在其内部维护一个RealShopService对象作为真实主题的引用。代理类可以在调用前后进行一些额外的处理,比如权限验证、支付逻辑等,

public class ProxyShopService implements ShopService {
    private RealShopService realService;
    public ProxyShopService() {
        // 初始化真实主题对象
        this.realService = new RealShopService();
    }
    @Override
    public void buyItem(String item, int quantity) {
        // 添加额外操作,比如权限验证
        if (用户有购买权限) {
            realService.buyItem(item, quantity);
            // 添加额外操作,比如支付逻辑
            进行支付(quantity * 商品价格);
        } else {
            System.out.println("您没有购买权限");
        }
    }
}

4.使用 Maven 进行项目管理: 在项目的 Maven 配置文件 pom.xml 中添加对相关依赖的配置

<dependencies>
    <!-- 第三方库 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>shopping-api</artifactId>
        <version>1.0.0</version>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>

Maven 会负责下载所需的依赖库,并将其添加到项目的构建路径中

5.在业务代码中使用代理对象: 在业务代码中,通过依赖注入或者工厂模式等方式,将代理对象ProxyShopService注入到需要购买商品的对象中,并调用其方法来完成购买操作

public class ShoppingCart {
    private ShopService shopService;
    public ShoppingCart(ShopService shopService) {
        this.shopService = shopService;
    }
    public void addItem(String item, int quantity) {
        // 根据用户操作将商品加入购物车
        // ...
    }
    public void checkout() {
        // 调用代理对象的方法进行购买操作
        shopService.buyItem(item, quantity);
    }
}

通过以上步骤,我们使用代理模式结合 Maven 进行了项目开发和管理。代理对象ProxyShopService在购买商品之前进行了额外的操作,比如权限验证和支付逻辑。这样可以保护数据的安全性,并且能够方便地对购买流程进行管理和扩展

在这里小编的分享就在这里结束了,希望小伙伴们多多支持!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
44 0
[Java]代理模式
|
8月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
70 1
|
4月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
8月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
8月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
67 2
|
5月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
6月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
85 0
|
6月前
|
设计模式 监控 Java
深入理解Java中的代理模式及其实现
深入理解Java中的代理模式及其实现
|
6月前
|
设计模式 监控 Java
深入理解Java中的代理模式及其实现
深入理解Java中的代理模式及其实现
|
7月前
|
设计模式 监控 安全
设计模式之代理模式(Java)
设计模式之代理模式(Java)