设计模式之装饰器模式

简介: **装饰器模式**是一种设计模式,用于在运行时动态添加或移除对象的功能,保持接口不变,无需修改原始代码。它适用于不修改已有代码而需动态扩展功能的场景。常见应用包括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未授权的响应;否则,继续执行后续的请求处理。

相关文章
|
2月前
|
设计模式 Java
设计模式之装饰器模式
设计模式之装饰器模式
|
7月前
|
设计模式 C++ 开发者
设计模式之装饰器模式(C++)
设计模式之装饰器模式(C++)
设计模式之装饰器模式(C++)
|
4月前
|
设计模式 Java uml
设计模式-装饰器模式
设计模式-装饰器模式
23 0
|
4月前
|
设计模式
结构型设计模式:装饰器模式
结构型设计模式:装饰器模式
24 0
|
4月前
|
设计模式 缓存 前端开发
【设计模式】之装饰器模式
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原有对象结构的情况下,动态地给对象添加额外的功能。装饰模式通过创建一个包装器(装饰器)来包裹原有对象,并在保持接口一致性的前提下,增加新的行为或修改原有行为。
43 0
|
7月前
|
设计模式
设计模式~装饰器模式-07
装饰器模式 优点 缺点 使用场景 指在不改变
27 0
|
12月前
|
设计模式 消息中间件 存储
一起来学设计模式之装饰器模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式中的装饰器模式,并结合实际业务场景给大家讲解如何使用~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地给一个对象添加额外的职责,而不需要修改原始类的代码。这种模式是作为替代继承方式的一种实现。
|
12月前
|
设计模式 Java 测试技术
浅谈设计模式 - 装饰器模式(五)
​ 装饰器模式是是对类进行增强的一种典型设计模式,它允许对于一个现有类进行增强的操作,对于喜欢使用继承的伙伴,这个模式非常贴切的展示的了对于继承的灵活用法。但是装饰器模式同样不是一个推崇使用的模式,因为他对于继承存在依赖性,从本文后续就可以了解到装饰类膨胀的问题,所以在设计代码结构的时候,装饰器模式并不是第一考虑。
46 0
|
设计模式 SQL 缓存
设计模式之装饰器模式
装饰器在java中最典型的应用就是IO,我们知道在IO家族中有各种各样的流,而流往往都是作用在子类之上,然后增加其附加功能,我们以InputStream 举例。
设计模式之装饰器模式
|
设计模式
设计模式-2-装饰器模式
装饰器模式(Decorator Pattern)就是在不改变原始对象本质的前提下,对现有类进行包装,从而提供出额外的功能。
78 1