┌─────────────────────────────┐ │ <<interface>> │ │ Logger │ ← Component ├─────────────────────────────┤ │ + log(String): void │ └─────────────────────────────┘ △ │ implements │ ┌─────────────────────────────┐ │ FileLogger │ ← Concrete Component ├─────────────────────────────┤ │ + log(String): void │ └─────────────────────────────┘ ┌─────────────────────────────┐ │ <<abstract>> │ │ LoggerDecorator │ ← Base Decorator ├─────────────────────────────┤ │ - logger: Logger │ │ + LoggerDecorator(Logger) │ │ + log(String): void │ └─────────────────────────────┘ △ │ extends │ ┌─────────────────┬───────────────────┐ │ TimestampLogger │ EncryptionLogger │ ← Concrete Decorators ├─────────────────┼───────────────────┤ │+ log(String) │+ log(String) │ └─────────────────┴───────────────────┘
Component Interface
:public interface Logger { void log(String message); }
Concrete Component
:public class FileLogger implements Logger { public void log(String message) { System.out.println("FileLogger: " + message); } }
Base Decorator
:public abstract class LoggerDecorator implements Logger { protected Logger logger; public LoggerDecorator(Logger logger) { this.logger = logger; } public void log(String message) { logger.log(message); } }
Concrete Decorators
:public class TimestampLogger extends LoggerDecorator { public TimestampLogger(Logger logger) { super(logger); } @Override public void log(String message) { String timestampedMessage = "[" + java.time.LocalDateTime.now() + "] " + message; super.log(timestampedMessage); } }Encryption Decorator:
public class EncryptionLogger extends LoggerDecorator { public EncryptionLogger(Logger logger) { super(logger); } @Override public void log(String message) { String encryptedMessage = "ENCRYPTED[" + message + "]"; super.log(encryptedMessage); } }
public class DecoratorPatternTest { public static void main(String[] args) { // Create the base component Logger fileLogger = new FileLogger(); // Example 1: Basic logging System.out.println("Basic Logging"); fileLogger.log("Simple log message"); // Example 2: Add timestamp decoration System.out.println("With Timestamp"); Logger timestampLogger = new TimestampLogger(fileLogger); timestampLogger.log("Message with timestamp"); // Example 3: Add encryption decoration System.out.println("With Encryption"); Logger encryptionLogger = new EncryptionLogger(fileLogger); encryptionLogger.log("Secret message"); // Example 4: Chain multiple decorators System.out.println("With Both Decorators"); Logger decoratedLogger = new EncryptionLogger(new TimestampLogger(fileLogger)); decoratedLogger.log("Fully decorated message"); } }