From 54e94dbbc05aa6c3af175cf07e4ea55250e4109e Mon Sep 17 00:00:00 2001 From: hesham-ashraf Date: Sat, 7 Dec 2024 22:07:58 +0200 Subject: [PATCH] Observer design pattern implementation --- Observer/Observer.java | 5 +++ Observer/PhoneDisplay.java | 15 +++++++ Observer/Subject.java | 7 +++ Observer/TVDisplay.java | 16 +++++++ Observer/WeatherApp.java | 18 ++++++++ Observer/WeatherStation.java | 31 ++++++++++++++ Observer/WeatherStationTest.java | 73 ++++++++++++++++++++++++++++++++ README.md | 2 + 8 files changed, 167 insertions(+) create mode 100644 Observer/Observer.java create mode 100644 Observer/PhoneDisplay.java create mode 100644 Observer/Subject.java create mode 100644 Observer/TVDisplay.java create mode 100644 Observer/WeatherApp.java create mode 100644 Observer/WeatherStation.java create mode 100644 Observer/WeatherStationTest.java diff --git a/Observer/Observer.java b/Observer/Observer.java new file mode 100644 index 0000000..c93b78b --- /dev/null +++ b/Observer/Observer.java @@ -0,0 +1,5 @@ +package Observer; + +public interface Observer { + void update(String weather); +} diff --git a/Observer/PhoneDisplay.java b/Observer/PhoneDisplay.java new file mode 100644 index 0000000..5853125 --- /dev/null +++ b/Observer/PhoneDisplay.java @@ -0,0 +1,15 @@ +package Observer; + +public class PhoneDisplay implements Observer { + private String weather; + + @Override + public void update(String weather) { + this.weather = weather; + display(); + } + + private void display() { + System.out.println("Phone Display: Weather updated - " + weather); + } +} diff --git a/Observer/Subject.java b/Observer/Subject.java new file mode 100644 index 0000000..1e8ff9e --- /dev/null +++ b/Observer/Subject.java @@ -0,0 +1,7 @@ +package Observer; + +public interface Subject { + void addObserver(Observer observer); + void removeObserver(Observer observer); + void notifyObservers(); +} diff --git a/Observer/TVDisplay.java b/Observer/TVDisplay.java new file mode 100644 index 0000000..0f0b82a --- /dev/null +++ b/Observer/TVDisplay.java @@ -0,0 +1,16 @@ +package Observer; + +class TVDisplay implements Observer { + private String weather; + + @Override + public void update(String weather) { + this.weather = weather; + display(); + } + + private void display() { + System.out.println("TV Display: Weather updated - " + weather); + } +} + diff --git a/Observer/WeatherApp.java b/Observer/WeatherApp.java new file mode 100644 index 0000000..9025048 --- /dev/null +++ b/Observer/WeatherApp.java @@ -0,0 +1,18 @@ +package Observer; + +public class WeatherApp { + public static void main(String[] args) { + WeatherStation weatherStation = new WeatherStation(); + + Observer phoneDisplay = new PhoneDisplay(); + Observer tvDisplay = new TVDisplay(); + + weatherStation.addObserver(phoneDisplay); + weatherStation.addObserver(tvDisplay); + + + weatherStation.setWeather("Sunny"); + + + } +} diff --git a/Observer/WeatherStation.java b/Observer/WeatherStation.java new file mode 100644 index 0000000..dd2efff --- /dev/null +++ b/Observer/WeatherStation.java @@ -0,0 +1,31 @@ +package Observer; + +import java.util.ArrayList; +import java.util.List; + +public class WeatherStation implements Subject { + private List observers = new ArrayList<>(); + private String weather; + + @Override + public void addObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + @Override + public void notifyObservers() { + for (Observer observer : observers) { + observer.update(weather); + } + } + + public void setWeather(String newWeather) { + this.weather = newWeather; + notifyObservers(); + } +} \ No newline at end of file diff --git a/Observer/WeatherStationTest.java b/Observer/WeatherStationTest.java new file mode 100644 index 0000000..837cee8 --- /dev/null +++ b/Observer/WeatherStationTest.java @@ -0,0 +1,73 @@ +package Observer; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class WeatherStationTest { + private WeatherStation weatherStation; + private TestObserver phoneDisplay; + private TestObserver tvDisplay; + + @BeforeEach + void setUp() { + weatherStation = new WeatherStation(); + phoneDisplay = new TestObserver(); + tvDisplay = new TestObserver(); + } + + @Test + void testAddObserverAndNotifyObservers() { + // Add observers + weatherStation.addObserver(phoneDisplay); + weatherStation.addObserver(tvDisplay); + + // Simulate weather change + weatherStation.setWeather("Rainy"); + + // Verify that all observers received the update + assertEquals("Rainy", phoneDisplay.getWeather()); + assertEquals("Rainy", tvDisplay.getWeather()); + } + + @Test + void testRemoveObserver() { + // Add observers + weatherStation.addObserver(phoneDisplay); + weatherStation.addObserver(tvDisplay); + + // Remove one observer + weatherStation.removeObserver(phoneDisplay); + + // Simulate weather change + weatherStation.setWeather("Cloudy"); + + // Verify only the remaining observer received the update + assertEquals(null, phoneDisplay.getWeather()); + assertEquals("Cloudy", tvDisplay.getWeather()); + } + + @Test + void testNoObservers() { + // Simulate weather change without any observers + weatherStation.setWeather("Windy"); + + // No exceptions should occur, nothing to verify + } + + // Custom TestObserver class + private static class TestObserver implements Observer { + private String weather; + + @Override + public void update(String weather) { + this.weather = weather; + } + + public String getWeather() { + return weather; + } + } +} + diff --git a/README.md b/README.md index cb3d676..bc3fe6c 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,8 @@ It is very easy to contribute, you may follow these steps - 99.[RotateLinkedList](https://github.com/PrajaktaSathe/Java/blob/main/Programs/RotateLinkedList.java)-Program to demo rotating a linked list 100. [ReverseString](https://github.com/PrajaktaSathe/Java/blob/main/ReverseString.java) -Program to reverse a String using the java method substring. 101.[Overriding](https://github.com/PrajaktaSathe/Java/blob/main/Programs/Overriding.java)-Program to demo overriding in java +102. [Observer-pattern](https://github.com/PrajaktaSathe/Java/blob/main/Programs/Observer/WeatherApp.java)- Observer design pattern in java + # Contributors - ## A big thank you to all our contributors!!!