【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))

装饰器模式

装饰器模式是一种结构型设计模式,用于动态地给对象添加额外的行为或责任,而不需要改变原始对象的结构。通过创建一个包装器类(装饰器),它包含原始对象的引用,并提供与原始对象相同的接口,可以在运行时灵活地添加、修改或移除原始对象的功能。

以下是一个简单的装饰器模式的示例:

java 复制代码
// 定义一个接口,表示组件(Component)
public interface Message {
    void send();
}

// 实现 Component 接口的具体组件类(ConcreteComponent)
public class EmailMessage implements Message {
    @Override
    public void send() {
        System.out.println("Sending email message");
    }
}

// 创建一个抽象装饰器类(Decorator),实现 Component 接口
public abstract class MessageDecorator implements Message {
    protected Message decoratedMessage;

    public MessageDecorator(Message decoratedMessage) {
        this.decoratedMessage = decoratedMessage;
    }

    @Override
    public void send() {
        decoratedMessage.send();
    }
}

// 具体装饰器类(ConcreteDecorator),扩展装饰器功能
public class SecureMessageDecorator extends MessageDecorator {
    public SecureMessageDecorator(Message decoratedMessage) {
        super(decoratedMessage);
    }

    @Override
    public void send() {
        encryptMessage();
        super.send();
    }

    private void encryptMessage() {
        System.out.println("Encrypting message");
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        // 创建具体组件对象
        Message emailMessage = new EmailMessage();

        // 创建装饰器对象,将具体组件对象传入
        Message secureEmailMessage = new SecureMessageDecorator(emailMessage);

        // 调用装饰后的方法
        secureEmailMessage.send();
    }
}

在上述示例中,Message 是一个表示消息发送的接口,EmailMessage 是实现了 Message 接口的具体组件类。MessageDecorator 是抽象装饰器类,它也实现了 Message 接口,并持有一个 Message 类型的引用。SecureMessageDecorator 是具体装饰器类,它扩展了装饰器的功能,包括对消息的加密操作。

通过使用装饰器模式,我们可以动态地向需要发送的消息添加额外的加密行为,而不需要修改原始的消息发送逻辑。在示例中,secureEmailMessage 是对 emailMessage 的装饰,通过调用 send() 方法,会先进行加密操作,然后再发送邮件。这样我们可以在运行时根据需要添加或者移除装饰器,以达到动态地增加功能的效果。

相关推荐
桦说编程1 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅3 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟4 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder4 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者4 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺4 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart5 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP6 小时前
MyBatis-mybatis入门与增删改查
java
孟陬10 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端