From 381e3cc9acc87f96c6b5f66dae9e9369c9da568e Mon Sep 17 00:00:00 2001 From: Namu Date: Mon, 6 Oct 2025 09:50:55 +0200 Subject: [PATCH] Feat: Decorator and facade implemented --- src/{utils => decorator}/BaseDecorator.java | 6 ++-- src/decorator/DateDecorator.java | 23 +++++++++++++++ src/decorator/WatermarkDecorator.java | 21 ++++++++++++++ src/entities/Notification.java | 29 +++++++++++++++++-- src/entities/User.java | 7 ++++- .../DateNotificationDecoration.java | 17 +++++++++++ .../NotificationDecoration.java | 21 ++++++++++++++ .../WatermarkNotificationDecoration.java | 14 +++++++++ src/utils/DateDecorator.java | 19 ------------ src/utils/NotificationObservable.java | 8 ++++- src/utils/WatermarkDecorator.java | 17 ----------- 11 files changed, 140 insertions(+), 42 deletions(-) rename src/{utils => decorator}/BaseDecorator.java (88%) create mode 100644 src/decorator/DateDecorator.java create mode 100644 src/decorator/WatermarkDecorator.java create mode 100644 src/notificationsDecorations/DateNotificationDecoration.java create mode 100644 src/notificationsDecorations/NotificationDecoration.java create mode 100644 src/notificationsDecorations/WatermarkNotificationDecoration.java delete mode 100644 src/utils/DateDecorator.java delete mode 100644 src/utils/WatermarkDecorator.java diff --git a/src/utils/BaseDecorator.java b/src/decorator/BaseDecorator.java similarity index 88% rename from src/utils/BaseDecorator.java rename to src/decorator/BaseDecorator.java index cddfa07..a293c8b 100644 --- a/src/utils/BaseDecorator.java +++ b/src/decorator/BaseDecorator.java @@ -1,6 +1,7 @@ -package utils; +package decorator; import entities.Notification; +import notificationsDecorations.NotificationDecoration; /** * Ces approches ne seront pas implémentées ici, car elles pourraient alourdir le code sans apport clair. @@ -18,10 +19,11 @@ import entities.Notification; */ public abstract class BaseDecorator { protected Notification notification; + protected NotificationDecoration decoration; public BaseDecorator(Notification notification) { this.notification = notification; } - public abstract void send(); + public abstract String getContent(); } diff --git a/src/decorator/DateDecorator.java b/src/decorator/DateDecorator.java new file mode 100644 index 0000000..99346c3 --- /dev/null +++ b/src/decorator/DateDecorator.java @@ -0,0 +1,23 @@ +package decorator; + +import entities.Notification; +import notificationsDecorations.DateNotificationDecoration; + +import java.util.Date; + +public class DateDecorator extends BaseDecorator { + public DateDecorator(Notification notification, Date date) { + super(notification); + notification.addDecoration(new DateNotificationDecoration(date)); + } + + public DateDecorator(BaseDecorator decorator, Date date) { + super(decorator.notification); + notification.addDecoration(new DateNotificationDecoration(date)); + } + + @Override + public String getContent() { + return notification.getContent(); + } +} diff --git a/src/decorator/WatermarkDecorator.java b/src/decorator/WatermarkDecorator.java new file mode 100644 index 0000000..1259317 --- /dev/null +++ b/src/decorator/WatermarkDecorator.java @@ -0,0 +1,21 @@ +package decorator; + +import entities.Notification; +import notificationsDecorations.WatermarkNotificationDecoration; + +public class WatermarkDecorator extends BaseDecorator { + public WatermarkDecorator(Notification notification, String watermark) { + super(notification); + notification.addDecoration(new WatermarkNotificationDecoration(watermark)); + } + + public WatermarkDecorator(BaseDecorator decorator, String watermark) { + super(decorator.notification); + notification.addDecoration(new WatermarkNotificationDecoration(watermark)); + } + + @Override + public String getContent() { + return this.notification.getContent(); + } +} diff --git a/src/entities/Notification.java b/src/entities/Notification.java index ca6a512..0baee61 100644 --- a/src/entities/Notification.java +++ b/src/entities/Notification.java @@ -1,11 +1,17 @@ package entities; +import notificationsDecorations.NotificationDecoration; import utils.NotificationState; import utils.SendNotificationStrategy; +import java.util.ArrayList; +import java.util.List; + public abstract class Notification { protected String content; protected User user; + protected List decorations; + /** * Pas de change state car chemin multiple. On reste sur des enum ! */ @@ -17,6 +23,15 @@ public abstract class Notification { this.user = user; this.state = NotificationState.PENDING; this.strategy = strategy; + this.decorations = new ArrayList<>(); + } + + /** + * Adds a decoration to the notification. Please use a decorator for that + * @param decoration + */ + public void addDecoration(NotificationDecoration decoration) { + decorations.add(decoration); } protected boolean isSendable() { @@ -41,9 +56,19 @@ public abstract class Notification { } public String getContent() { - if (isSendable()) { + if (isSendable() && content != "") { transitionState(); - return strategy.makeContent(user.id() + " Push: " + user.name() + " " + content); + StringBuilder builder = new StringBuilder(); + + if (decorations.isEmpty()) + return content; + + builder.append(content); + + for (final NotificationDecoration decoration : decorations) + builder.append(decoration.transformContent()); + + return builder.toString(); } setKoState(); return ""; diff --git a/src/entities/User.java b/src/entities/User.java index f832bdc..356791b 100644 --- a/src/entities/User.java +++ b/src/entities/User.java @@ -5,5 +5,10 @@ import utils.SendNotificationStrategy; import java.util.List; -public record User(int id, String name, List notificationsTypes, SendNotificationStrategy chosenNotificationStrategy) { +public record User( + int id, + String name, + List notificationsTypes, + SendNotificationStrategy chosenNotificationStrategy + ) { } diff --git a/src/notificationsDecorations/DateNotificationDecoration.java b/src/notificationsDecorations/DateNotificationDecoration.java new file mode 100644 index 0000000..bec955f --- /dev/null +++ b/src/notificationsDecorations/DateNotificationDecoration.java @@ -0,0 +1,17 @@ +package notificationsDecorations; + +import java.util.Date; + +public class DateNotificationDecoration extends NotificationDecoration { + private final Date date; + + public DateNotificationDecoration(Date date) { + super(); + this.date = date; + } + + @Override + public String transformContent() { + return ": " + date.toString(); + } +} diff --git a/src/notificationsDecorations/NotificationDecoration.java b/src/notificationsDecorations/NotificationDecoration.java new file mode 100644 index 0000000..c7c4510 --- /dev/null +++ b/src/notificationsDecorations/NotificationDecoration.java @@ -0,0 +1,21 @@ +package notificationsDecorations; + +import entities.Notification; + +/** + * On cherche à pouvoir ajouter des décorations aux notifications. + * + * Pour ce faire, on part de cette classe abstraite qui permettra de faire du polymorphisme. + * + * Ensuite, les décorateurs ajouteront une décoration aux notifications qui ont une liste de + * décorations. + */ +public abstract class NotificationDecoration { + protected Notification notification; + + /** + * Each decoration apply a transformation on the content of the Notifications + * @return the content transformed + */ + public abstract String transformContent(); +} diff --git a/src/notificationsDecorations/WatermarkNotificationDecoration.java b/src/notificationsDecorations/WatermarkNotificationDecoration.java new file mode 100644 index 0000000..6f0c4a9 --- /dev/null +++ b/src/notificationsDecorations/WatermarkNotificationDecoration.java @@ -0,0 +1,14 @@ +package notificationsDecorations; + +public class WatermarkNotificationDecoration extends NotificationDecoration { + private String waterMark; + + public WatermarkNotificationDecoration(String waterMark) { + this.waterMark = waterMark; + } + + @Override + public String transformContent() { + return "\n" + waterMark; + } +} diff --git a/src/utils/DateDecorator.java b/src/utils/DateDecorator.java deleted file mode 100644 index c8c4a5d..0000000 --- a/src/utils/DateDecorator.java +++ /dev/null @@ -1,19 +0,0 @@ -package utils; - -import entities.Notification; - -import java.util.Date; - -public class DateDecorator extends BaseDecorator { - private final Date date; - - public DateDecorator(Notification notification, Date date) { - super(notification); - this.date = date; - } - - @Override - public void send() { - System.out.println(this.notification.getContent() + " " + date.toString()); - } -} diff --git a/src/utils/NotificationObservable.java b/src/utils/NotificationObservable.java index 4082389..515e20c 100644 --- a/src/utils/NotificationObservable.java +++ b/src/utils/NotificationObservable.java @@ -1,8 +1,12 @@ package utils; +import decorator.BaseDecorator; +import decorator.DateDecorator; +import decorator.WatermarkDecorator; import entities.User; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class NotificationObservable { @@ -22,7 +26,9 @@ public class NotificationObservable { for (final var subscriber : this.subscribers) { for (final var notificationType : subscriber.notificationsTypes()) { var notification = factory.createNotification(notificationType, content, subscriber, subscriber.chosenNotificationStrategy()); - System.out.println(notification.getContent()); + // Ici j'applique automatiquement les décorations, évidement, il serait mieux de la faire dynamiquement. + BaseDecorator decorator = new WatermarkDecorator(new DateDecorator(notification, new Date()), "Thomas"); + System.out.println(decorator.getContent()); } } } diff --git a/src/utils/WatermarkDecorator.java b/src/utils/WatermarkDecorator.java deleted file mode 100644 index be5343e..0000000 --- a/src/utils/WatermarkDecorator.java +++ /dev/null @@ -1,17 +0,0 @@ -package utils; - -import entities.Notification; - -public class WatermarkDecorator extends BaseDecorator { - private final String watermark; - - public WatermarkDecorator(Notification notification, String watermark) { - super(notification); - this.watermark = watermark; - } - - @Override - public void send() { - System.out.println(this.notification.getContent() + " " + watermark); - } -}