diff --git a/src/main/java/com/designpatterns/structural/proxy/Citizen.java b/src/main/java/com/designpatterns/structural/proxy/Citizen.java new file mode 100644 index 00000000..3f34e5f7 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/Citizen.java @@ -0,0 +1,11 @@ +package com.designpatterns.structural.proxy; + +import com.designpatterns.structural.proxy.president.PresidentSecretary; + +public class Citizen { + + public static void main(String[] args) { + PresidentSecretary presidentSecretary = new PresidentSecretary(); + presidentSecretary.leaveValidMessageForPresident("Hello president."); + } +} diff --git a/src/main/java/com/designpatterns/structural/proxy/president/President.java b/src/main/java/com/designpatterns/structural/proxy/president/President.java new file mode 100644 index 00000000..18d0e31c --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/president/President.java @@ -0,0 +1,27 @@ +package com.designpatterns.structural.proxy.president; + +import com.designpatterns.creational.singleton.Singleton; + +public class President { + + private volatile static President instance = null; + + private President() {} + + static President getInstance() { + if (instance == null) { + synchronized (Singleton.class) { + if (instance == null) { + instance = new President(); + } + } + } + return instance; + } + + + + void talkToThePresident(String message){ + System.out.println("I, the President, have received this message:" + message); + } +} diff --git a/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java new file mode 100644 index 00000000..fd90a0b0 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java @@ -0,0 +1,25 @@ +package com.designpatterns.structural.proxy.president; + +public class PresidentSecretary { + + private President president; + + public PresidentSecretary() { + this.president = President.getInstance(); + } + + public void leaveValidMessageForPresident(String message){ + + if(!isMessageValid(message)) + throw new RuntimeException("invalid message"); + + System.out.println("message is being sent to the President..."); + president.talkToThePresident(message); + System.out.println("message is received by the President."); + + } + + private boolean isMessageValid(String message) { + return message != null && !message.isEmpty() && message.length() >= 10 && message.length() <= 100; + } +} diff --git a/src/test/java/com/designpatterns/structural/proxy/Citizen.java b/src/test/java/com/designpatterns/structural/proxy/Citizen.java new file mode 100644 index 00000000..7f2fc459 --- /dev/null +++ b/src/test/java/com/designpatterns/structural/proxy/Citizen.java @@ -0,0 +1,39 @@ +package com.designpatterns.structural.proxy; + +import com.designpatterns.structural.proxy.president.PresidentSecretary; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class Citizen { + + + private PresidentSecretary presidentSecretary = new PresidentSecretary(); + + @Test + public void talkToPresident_secretaryShouldRejectTooShortMessage() { + String message = "Hi there."; + + Assertions.assertThrows(RuntimeException.class, () -> { + presidentSecretary.leaveValidMessageForPresident(message); + }); + } + + @Test + public void talkToPresident_secretaryShouldRejectTooLongMessage() { + String message = "Hi there. this is a message about some personal issue which I have decided to share with Mr.President."; + + Assertions.assertThrows(RuntimeException.class, () -> { + presidentSecretary.leaveValidMessageForPresident(message); + }); + } + + @Test + public void talkToPresident_secretaryShouldAcceptTheMessage() { + String message = "Hello Mr.President"; + + presidentSecretary.leaveValidMessageForPresident(message); + Assertions.assertTrue(true); + } + + +}