his system demonstrates OOP best practices, SOLID principles, and applies core design patterns like Strategy, Factory, and Observer.
π£ Problem Statement: Notification System
Design a Notification System that can:
- Send notifications via Email, SMS, and Push
- Be easily extensible for new channels (e.g., WhatsApp)
- Support priority levels, batch delivery, and retry on failure
π§° Design Patterns Used
Pattern | Purpose |
---|---|
Strategy | Channel-based notification logic |
Factory | Create appropriate channel instance |
Observer | Notify multiple channels at once |
Template | Common retry and failure logic |
π¦ Package Structure
com.notification
βββ core/
β βββ Notification.java
β βββ NotificationService.java
β βββ NotificationChannel.java
βββ channels/
β βββ EmailChannel.java
β βββ SMSChannel.java
β βββ PushChannel.java
βββ factory/
β βββ NotificationChannelFactory.java
βββ observer/
β βββ NotificationPublisher.java
βββ model/
β βββ NotificationRequest.java
βββ Main.java
β UML Diagram (ASCII View)
+-----------------------------+
| NotificationService |
+-----------------------------+
| +send(NotificationRequest) |
+-----------------------------+
|
βΌ
+------------------------------+
| NotificationChannel | <<interface>> (Strategy)
+------------------------------+
| +send(NotificationRequest) |
+------------------------------+
β² β² β²
| | |
+----------------+ +----------------+ +----------------+
| EmailChannel | | SMSChannel | | PushChannel |
+----------------+ +----------------+ +----------------+
| Implements NotificationChannel |
+----------------+ +----------------+ +----------------+
+-----------------------------+
| NotificationChannelFactory |
+-----------------------------+
| +getChannel(String): NotificationChannel |
+-----------------------------+
+--------------------------+
| NotificationPublisher | <<Observer>>
+--------------------------+
| - subscribers: List<NotificationChannel> |
| +subscribe(channel) |
| +notifyAll(NotificationRequest) |
+--------------------------+
+--------------------------+
| NotificationRequest |
+--------------------------+
| - message: String |
| - recipient: String |
| - priority: int |
| - channel: String |
+--------------------------+
π‘ Class Responsibilities
πΉ NotificationRequest
Represents the payload to be sent.
public class NotificationRequest {
private String message;
private String recipient;
private String channel;
private int priority;
// Constructors, Getters, Setters
}
πΉ NotificationChannel
(Strategy Interface)
public interface NotificationChannel {
void send(NotificationRequest request);
}
πΉ EmailChannel
, SMSChannel
, PushChannel
Each implements the NotificationChannel
strategy.
public class EmailChannel implements NotificationChannel {
public void send(NotificationRequest request) {
System.out.println("Sending EMAIL to " + request.getRecipient());
}
}
Same for SMSChannel
, PushChannel
.
πΉ NotificationChannelFactory
public class NotificationChannelFactory {
public static NotificationChannel getChannel(String type) {
return switch (type.toLowerCase()) {
case "email" -> new EmailChannel();
case "sms" -> new SMSChannel();
case "push" -> new PushChannel();
default -> throw new IllegalArgumentException("Unsupported channel");
};
}
}
πΉ NotificationPublisher
(Observer Pattern)
public class NotificationPublisher {
private final List<NotificationChannel> subscribers = new ArrayList<>();
public void subscribe(NotificationChannel channel) {
subscribers.add(channel);
}
public void notifyAll(NotificationRequest request) {
for (NotificationChannel channel : subscribers) {
channel.send(request);
}
}
}
πΉ NotificationService
public class NotificationService {
public void send(NotificationRequest request) {
NotificationChannel channel = NotificationChannelFactory.getChannel(request.getChannel());
channel.send(request);
}
}
πΉ Main.java
public class Main {
public static void main(String[] args) {
NotificationRequest email = new NotificationRequest("Hello", "user@example.com", "email", 1);
NotificationRequest sms = new NotificationRequest("Hi", "9999999999", "sms", 2);
NotificationService service = new NotificationService();
service.send(email);
service.send(sms);
// Observer pattern usage
NotificationPublisher publisher = new NotificationPublisher();
publisher.subscribe(new EmailChannel());
publisher.subscribe(new SMSChannel());
NotificationRequest bulk = new NotificationRequest("Broadcast", "all-users", "", 1);
publisher.notifyAll(bulk);
}
}
β Benefits of This Design
Benefit | How Itβs Achieved |
---|---|
Extensibility | Add new channel by implementing NotificationChannel
|
Loose coupling | Via interfaces and factory usage |
Scalability | Easily integrate retry, queue, priority |
Testability | Each class has single responsibility |
Top comments (0)