┌─────────────────────────────┐ │ <<interface>> │ │ MessageSender │ ← Abstraction ├─────────────────────────────┤ │ + sendMessage(): void │ └─────────────────────────────┘ △ │ implements │ ┌─────────────────┬───────────────────┐ │ EmailSender │ SMSSender │ ← Refined Abstractions ├─────────────────┼───────────────────┤ │- logger: Logger │- logger: Logger │ │+ sendMessage() │+ sendMessage() │ └─────────────────┴───────────────────┘ │ │ │ uses │ uses ▼ ▼ ┌─────────────────────────────┐ │ <<interface>> │ │ Logger │ ← Implementor ├─────────────────────────────┤ │ + log(String): void │ └─────────────────────────────┘ △ │ implements │ ┌─────────────────┬───────────────────┐ │ FileLogger │ ConsoleLogger │ ← Concrete Implementors ├─────────────────┼───────────────────┤ │+ log(String) │+ log(String) │ └─────────────────┴───────────────────┘
Implementor Interface
:public interface Logger { void log(String message); }
Concrete Implementors
:public class FileLogger implements Logger { public void log(String message) { System.out.println("FileLogger: Writing to file - " + message); } }Console Logger Implementation:
public class ConsoleLogger implements Logger { public void log(String message) { System.out.println("ConsoleLogger: Writing to console - " + message); } }
Abstraction
:public interface MessageSender { void sendMessage(); }
Refined Abstractions
:public class EmailSender implements MessageSender { private Logger logger; public EmailSender(Logger logger) { this.logger = logger; } public void sendMessage() { String message = "Email sent successfully"; logger.log(message); } }SMS Sender:
public class SMSSender implements MessageSender { private Logger logger; public SMSSender(Logger logger) { this.logger = logger; } public void sendMessage() { String message = "SMS sent successfully"; logger.log(message); } }
public class BridgePatternTest { public static void main(String[] args) { // Create different logger implementations Logger fileLogger = new FileLogger(); Logger consoleLogger = new ConsoleLogger(); // Example 1: Email with File Logging MessageSender emailWithFileLog = new EmailSender(fileLogger); emailWithFileLog.sendMessage(); // Example 2: Email with Console Logging MessageSender emailWithConsoleLog = new EmailSender(consoleLogger); emailWithConsoleLog.sendMessage(); // Example 3: SMS with File Logging MessageSender smsWithFileLog = new SMSSender(fileLogger); smsWithFileLog.sendMessage(); // Example 4: SMS with Console Logging MessageSender smsWithConsoleLog = new SMSSender(consoleLogger); smsWithConsoleLog.sendMessage(); } }