java装饰器设计模式

时间:2024-10-30 16:13:56

装饰器设计模式来达到类似效果。这种模式通常用于动态地添加功能,特别适合在类或接口上扩展行为。Java装饰器模式通常涉及创建一个装饰器类,该类实现被装饰对象的接口并持有被装饰对象的实例。

装饰器模式示例

假设我们有一个MessageService接口,以及其实现SimpleMessageService

// 接口
public interface MessageService {
    String sendMessage(String message);
}

// 实现
public class SimpleMessageService implements MessageService {
    @Override
    public String sendMessage(String message) {
        return "Sending message: " + message;
    }
}

我们希望动态添加功能,比如记录消息发送的日志,或对消息内容进行加密。

装饰器类

// 装饰器类
public class MessageServiceDecorator implements MessageService {
    private MessageService decoratedService;

    public MessageServiceDecorator(MessageService service) {
        this.decoratedService = service;
    }

    @Override
    public String sendMessage(String message) {
        return decoratedService.sendMessage(message);
    }
}

// 日志装饰器
public class LoggingMessageService extends MessageServiceDecorator {
    public LoggingMessageService(MessageService service) {
        super(service);
    }

    @Override
    public String sendMessage(String message) {
        System.out.println("Logging: " + message);
        return super.sendMessage(message);
    }
}

// 加密装饰器
public class EncryptedMessageService extends MessageServiceDecorator {
    public EncryptedMessageService(MessageService service) {
        super(service);
    }

    @Override
    public String sendMessage(String message) {
        String encryptedMessage = encrypt(message);
        return super.sendMessage(encryptedMessage);
    }

    private String encrypt(String message) {
        // 简单的加密示例
        return new StringBuilder(message).reverse().toString();
    }
}

使用装饰器

public class Main {
    public static void main(String[] args) {
        MessageService service = new SimpleMessageService();
        
        // 添加日志功能
        service = new LoggingMessageService(service);
        
        // 添加加密功能
        service = new EncryptedMessageService(service);

        // 调用sendMessage
        System.out.println(service.sendMessage("Hello, World!"));
    }
}

在此示例中,LoggingMessageServiceEncryptedMessageService都装饰了MessageService接口,实现了动态添加日志和加密功能的效果。每个装饰器类都可以叠加,形成一条“装饰链”。

  • Java装饰器:基于设计模式,适用于类的增强和接口的扩展,通过组合方式添加功能,适合面向对象编程。