【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() 方法,会先进行加密操作,然后再发送邮件。这样我们可以在运行时根据需要添加或者移除装饰器,以达到动态地增加功能的效果。

相关推荐
qq_2975746717 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚17 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学17 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang2015092817 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚17 小时前
Java入门17——异常
java·开发语言
缘空如是17 小时前
基础工具包之JSON 工厂类
java·json·json切换
追逐梦想的张小年18 小时前
JUC编程04
java·idea
好家伙VCC18 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
南极星100518 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
消失的旧时光-194318 小时前
第十三课:权限系统如何设计?——RBAC 与 Spring Security 架构
java·架构·spring security·rbac