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

相关推荐
NE_STOP2 分钟前
SpringBoot--简单入门
java·spring
hqxstudying28 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队2 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端