Feat: Decorator and facade implemented
Some checks failed
SonarQube Scan / SonarQube Trigger (push) Failing after 19s

This commit is contained in:
Namu
2025-10-06 09:50:55 +02:00
parent d868ec63c9
commit 381e3cc9ac
11 changed files with 140 additions and 42 deletions

View File

@@ -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();
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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<NotificationDecoration> 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 "";

View File

@@ -5,5 +5,10 @@ import utils.SendNotificationStrategy;
import java.util.List;
public record User(int id, String name, List<NotificationType> notificationsTypes, SendNotificationStrategy chosenNotificationStrategy) {
public record User(
int id,
String name,
List<NotificationType> notificationsTypes,
SendNotificationStrategy chosenNotificationStrategy
) {
}

View File

@@ -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();
}
}

View File

@@ -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();
}

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}
}

View File

@@ -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);
}
}