设计模式之装饰器模式

简介: **装饰器模式**是一种设计模式,用于在运行时动态添加或移除对象的功能,保持接口不变,无需修改原始代码。它适用于不修改已有代码而需动态扩展功能的场景。常见应用包括GUI组件增强、Web开发中的函数扩展、缓存与代理、日志记录、数据库连接池和事务管理等。在Java的Web开发中,Spring框架的拦截器(Interceptor)是一个实现示例,用于权限控制等预处理或后处理任务。

那么什么是装饰模式呢?

其实吖,装饰器模式是一种常见的设计模式,这种模式通过创建一个包装器类,该类包含对原始对象的引用,并且可以在运行时添加新的功能,从而实现了对原始对象的扩展,同时保持了其接口不变。

这种模式通常用于在不修改其原始代码的情况下,动态地添加或删除功能或行为到对象上。这样可以避免对现有代码的修改,同时提高了代码的可维护性和可扩展性。


综上所述: 装饰器模式适用于需要在不修改现有对象代码的情况下,动态地添加新功能或行为的场景;

应用场景:

1. 图形界面应用程序:

在 GUI 应用程序中,装饰器模式可以用于动态地添加和移除窗口部件或控件的功能,例如:给按钮添加点击事件、给文本框添加验证等。


2. Web 开发:

在 Web 开发中,装饰器模式可以用于增强函数或方法的功能。(不例如了,下面直接 DEMO)


3. 缓存和代理:

装饰器模式可以用于创建缓存或代理对象,以提高性能或实现懒加载。例如,可以通过装饰器在方法调用前检查缓存中是否存在结果,并在缓存中找到结果时直接返回,而不必再次执行方法。


4. 日志记录:

装饰器模式可以用于添加日志记录功能,例如,在方法执行前后记录方法的输入参数和返回值,或者记录方法的执行时间等信息。


5. 数据库连接池:

在数据库访问中,装饰器模式可以用于创建数据库连接池对象,以减少数据库连接的开销并提高性能。


6. 事务管理:

在数据库操作中,可以使用装饰器模式来实现事务管理,例如,可以创建一个装饰器来在方法执行前开启事务,在方法执行后提交事务或者回滚事务,从而确保数据的一致性和完整性。


7. 性能监控:

可以使用装饰器模式来实现性能监控功能,例如,可以创建一个装饰器来记录方法的执行时间,并将执行时间输出到日志中,以便分析和优化系统的性能。

......

咋们就挑WEB来说说java的实现吧

在Spring框架中,可以使用拦截器(Interceptor)来实现权限控制,拦截器可以在请求到达Controller 前或后进行拦截和处理。

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 假设从请求中获取用户身份信息(这里只是一个简单示例)
        String userId = request.getHeader(UserEnum.USER_ID); // userId
        if (ObjectUtils.isEmpty(userId) || !isAuthenticated(userId)) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 码
            return false;
        }
        return true;
    }
    private boolean isAuthenticated(String userId) {
        // 假设用户ID为偶数时有权限访问
        return Integer.parseInt(userId) % 2 == 0;
    }
}

在这个DEMO中,我们去定义了一个了拦截器,拦截所有请求,检查用户的访问权限。

实现方式为

首先从请求中获取用户身份信息,

然后根据身份信息判断用户是否已经认证。

如果用户未认证或者认证失败,则返回401未授权的响应;否则,继续执行后续的请求处理。

相关文章
|
6月前
|
设计模式 存储 缓存
聊聊Java设计模式-装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。
60 1
聊聊Java设计模式-装饰器模式
|
6月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
60 2
|
6月前
|
设计模式
设计模式之装饰器模式
设计模式之装饰器模式
|
6月前
|
设计模式
设计模式-装饰器模式
设计模式-装饰器模式
|
1月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
29 0
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
63 1
|
2月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
5月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
5月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
264 0
|
6月前
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
121 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78