Feat: Decorator and facade implemented
Some checks failed
SonarQube Scan / SonarQube Trigger (push) Failing after 19s
Some checks failed
SonarQube Scan / SonarQube Trigger (push) Failing after 19s
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package utils;
|
package decorator;
|
||||||
|
|
||||||
import entities.Notification;
|
import entities.Notification;
|
||||||
|
import notificationsDecorations.NotificationDecoration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ces approches ne seront pas implémentées ici, car elles pourraient alourdir le code sans apport clair.
|
* 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 {
|
public abstract class BaseDecorator {
|
||||||
protected Notification notification;
|
protected Notification notification;
|
||||||
|
protected NotificationDecoration decoration;
|
||||||
|
|
||||||
public BaseDecorator(Notification notification) {
|
public BaseDecorator(Notification notification) {
|
||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void send();
|
public abstract String getContent();
|
||||||
}
|
}
|
||||||
23
src/decorator/DateDecorator.java
Normal file
23
src/decorator/DateDecorator.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/decorator/WatermarkDecorator.java
Normal file
21
src/decorator/WatermarkDecorator.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,17 @@
|
|||||||
package entities;
|
package entities;
|
||||||
|
|
||||||
|
import notificationsDecorations.NotificationDecoration;
|
||||||
import utils.NotificationState;
|
import utils.NotificationState;
|
||||||
import utils.SendNotificationStrategy;
|
import utils.SendNotificationStrategy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class Notification {
|
public abstract class Notification {
|
||||||
protected String content;
|
protected String content;
|
||||||
protected User user;
|
protected User user;
|
||||||
|
protected List<NotificationDecoration> decorations;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pas de change state car chemin multiple. On reste sur des enum !
|
* Pas de change state car chemin multiple. On reste sur des enum !
|
||||||
*/
|
*/
|
||||||
@@ -17,6 +23,15 @@ public abstract class Notification {
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.state = NotificationState.PENDING;
|
this.state = NotificationState.PENDING;
|
||||||
this.strategy = strategy;
|
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() {
|
protected boolean isSendable() {
|
||||||
@@ -41,9 +56,19 @@ public abstract class Notification {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getContent() {
|
public String getContent() {
|
||||||
if (isSendable()) {
|
if (isSendable() && content != "") {
|
||||||
transitionState();
|
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();
|
setKoState();
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -5,5 +5,10 @@ import utils.SendNotificationStrategy;
|
|||||||
|
|
||||||
import java.util.List;
|
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
|
||||||
|
) {
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/notificationsDecorations/DateNotificationDecoration.java
Normal file
17
src/notificationsDecorations/DateNotificationDecoration.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/notificationsDecorations/NotificationDecoration.java
Normal file
21
src/notificationsDecorations/NotificationDecoration.java
Normal 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();
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
package utils;
|
package utils;
|
||||||
|
|
||||||
|
import decorator.BaseDecorator;
|
||||||
|
import decorator.DateDecorator;
|
||||||
|
import decorator.WatermarkDecorator;
|
||||||
import entities.User;
|
import entities.User;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class NotificationObservable {
|
public class NotificationObservable {
|
||||||
@@ -22,7 +26,9 @@ public class NotificationObservable {
|
|||||||
for (final var subscriber : this.subscribers) {
|
for (final var subscriber : this.subscribers) {
|
||||||
for (final var notificationType : subscriber.notificationsTypes()) {
|
for (final var notificationType : subscriber.notificationsTypes()) {
|
||||||
var notification = factory.createNotification(notificationType, content, subscriber, subscriber.chosenNotificationStrategy());
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user