Saturday, 25 January 2014

Bridge Design pattern - Implementation [Send Message]

Master Software Architecture & Clean Code!

Subscribe to Ram N Java for clean code, design pattern implementations, and practical Java tutorials!

SUBSCRIBE NOW

Decoupling Abstraction and Implementation

The Bridge Design Pattern separates an abstraction from its underlying implementation, allowing both class hierarchies to vary independently. In real-world enterprise applications, hardcoding messaging channels directly into message types leads to tight coupling and unnecessary subclass proliferation.

By utilizing object composition instead of deep inheritance, the Bridge pattern provides a clean, maintainable structure where message categories and delivery transports remain loosely coupled.

Complete Java Code Walkthrough

Here is an end-to-end implementation illustrating message sending across multiple delivery channels using the Bridge pattern:

// 1. Implementor Interface
interface MessageSender {
    void sendMessage(String message);
}

// 2. Concrete Implementors
class EmailSender implements MessageSender {
    @Override
    public void sendMessage(String message) {
        System.out.println("Email: Sending -> " + message);
    }
}

class SmsSender implements MessageSender {
    @Override
    public void sendMessage(String message) {
        System.out.println("SMS: Sending -> " + message);
    }
}

// 3. Abstraction
abstract class Message {
    protected MessageSender messageSender;

    public Message(MessageSender messageSender) {
        this.messageSender = messageSender;
    }

    public abstract void send(String content);
}

// 4. Refined Abstraction
class UrgentMessage extends Message {
    public UrgentMessage(MessageSender messageSender) {
        super(messageSender);
    }

    @Override
    public void send(String content) {
        messageSender.sendMessage("[URGENT ALERT] " + content);
    }
}

class NormalMessage extends Message {
    public NormalMessage(MessageSender messageSender) {
        super(messageSender);
    }

    @Override
    public void send(String content) {
        messageSender.sendMessage("[INFO] " + content);
    }
}

// 5. Client Application
public class MessageBridgeDemo {
    public static void main(String[] args) {
        // Send urgent alert via SMS
        MessageSender sms = new SmsSender();
        Message alert = new UrgentMessage(sms);
        alert.send("Server CPU usage exceeded 90%!");

        // Send regular information via Email
        MessageSender email = new EmailSender();
        Message newsletter = new NormalMessage(email);
        newsletter.send("Weekly engineering updates are published.");
    }
}

Key Architectural Takeaways

  • Composition Over Inheritance: Avoids multi-level inheritance hierarchies and messy diamond problem dilemmas.
  • Runtime Flexibility: Different message sender channels can be swapped dynamically based on system rules or user configurations.
  • Seamless Extensibility: Introducing a new message type (such as EncryptedMessage) or transport medium (such as SlackSender) requires zero modifications to existing classes.

Watch More Related Design Pattern Tutorials


Click here to watch in Youtube : https://www.youtube.com/watch?v=Sqpgv1QMIPk

Click the below Image to Enlarge
Bridge Design pattern - Implementation [Send Message]














Bridge Design pattern - Implementation [Send Message] - Class Diagram






















MessageSender.java


public interface MessageSender
{
public void sendMessage(String message);
}

SmsMessageSender.java

public class SmsMessageSender implements MessageSender
{
public void sendMessage(String message)
{
System.out.println("'"+message+ "'   : This Message has been sent using SMS");
}
}

EmailMessageSender.java

public class EmailMessageSender implements MessageSender
{
public void sendMessage(String message)
{
System.out.println("'"+message+ "'   : This Message has been sent using Email");
}
}

Message.java

abstract class Message
{
protected MessageSender messageSender;

abstract public void sendMessage(String message);

}

ShortMessage.java

public class ShortMessage extends Message
{
public ShortMessage(MessageSender messageSender)
{
super.messageSender = messageSender;
}
@Override
public void sendMessage(String message)
{
if(message.length()<=5)
{
messageSender.sendMessage(message);
}
else
{
System.out.println("Sorry cannot send the message.....");
}
}

}

LongMessage.java

public class LongMessage extends Message
{

public LongMessage(MessageSender messageSender)
{
super.messageSender = messageSender;
}

@Override
public void sendMessage(String message)
{
messageSender.sendMessage(message);
}

}

Client.java

import java.util.Scanner;

public class Client
{

public static void main(String[] args)
{

System.out.println("Do you want to send 'longmessage' or 'shortmessage' ?");
Scanner scanner = new Scanner(System.in);
String messageType = scanner.next();

System.out.println("Please enter the message you want to send");
Scanner scanner1 = new Scanner(System.in);
String message = scanner1.nextLine();
if (messageType.equalsIgnoreCase("longmessage"))
{
Message longMessage = new LongMessage(new EmailMessageSender());
longMessage.sendMessage(message);
}
else
{
Message shortMessage = new ShortMessage(new SmsMessageSender());
shortMessage.sendMessage(message);
}

}
}

Output

Do you want to send 'longmessage' or 'shortmessage' ?
longmessage
Please enter the message you want to send
Hello how are you ? when did you come?
'Hello how are you ? when did you come?'   : This Message has been sent using Email

Do you want to send 'longmessage' or 'shortmessage' ?
shortmessage
Please enter the message you want to send
hi
'hi'   : This Message has been sent using SMS

See also:


  • Bridge Design pattern - Introduction
  • Bridge Design pattern - Real time example [Send Message]
  • Bridge Design pattern - Real time example [Publish Message]
  • Bridge Design pattern - Real time example [Shape]
  • Bridge Design pattern - Real time example [TV]
  • Bridge Design pattern - Class Diagram
  • Bridge Design pattern - Implementation [Shape]
  • Bridge Design pattern - Implementation [Publish Message]
  • Bridge Design pattern - Implementation [LED TV]
  • Bridge Design pattern - Keypoints
  • All Design Patterns Links
  • No comments:

    Post a Comment

    Tutorials