diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/mediator/Mediator.java b/src/main/java/ru/lconnected/patternexamples/behavioral/mediator/Mediator.java index ed2b331..a97800b 100644 --- a/src/main/java/ru/lconnected/patternexamples/behavioral/mediator/Mediator.java +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/mediator/Mediator.java @@ -1,6 +1,8 @@ package ru.lconnected.patternexamples.behavioral.mediator; /** + * Является посредником для взаимодействия нескольких объектов + * Уменьшает явную связь между ними * Created by lkhruschev on 11.11.2016. * lkhruschev@alvioneurope.ru * Skype: levasfx diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observable.java b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observable.java new file mode 100644 index 0000000..f44f2a1 --- /dev/null +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observable.java @@ -0,0 +1,15 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +/** + * Делает класс наблюдаемым + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public interface Observable { + + void registerObserver(Observer observer); + void removeObserver(Observer observer); + void notifyObservers(); + +} diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observer.java b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observer.java new file mode 100644 index 0000000..46bfa71 --- /dev/null +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/Observer.java @@ -0,0 +1,13 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +/** + * Описывает поведения наблюдателя, в данном случае для класса WeatherData + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public interface Observer { + + void update(float temperature, float humidity, int pressure); + +} \ No newline at end of file diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/observer/TemperatureConverter.java b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/TemperatureConverter.java new file mode 100644 index 0000000..635952d --- /dev/null +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/TemperatureConverter.java @@ -0,0 +1,26 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +/** + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public class TemperatureConverter implements Observer { + + private WeatherData weatherData; + + public TemperatureConverter(WeatherData weatherData) { + this.weatherData = weatherData; + this.weatherData.registerObserver(this); + } + + @Override + public void update(float temperature, float humidity, int pressure) { + System.out.println("[Temperature in fahrenheit] - " + convert(temperature)); + } + + private float convert(float temperature) { + return temperature * (9/5) + 32; + } + +} diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherData.java b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherData.java new file mode 100644 index 0000000..cf07bdb --- /dev/null +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherData.java @@ -0,0 +1,46 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public class WeatherData implements Observable { + + private List observers; + private float temperature; + private float humidity; + private int pressure; + + public WeatherData() { + observers = new ArrayList<>(); + } + + @Override + public void registerObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + @Override + public void notifyObservers() { + for (Observer observer : observers) { + observer.update(temperature, humidity, pressure); + } + } + + public void setMeasurements(float temperature, float humidity, int pressure) { + this.temperature = temperature; + this.humidity = humidity; + this.pressure = pressure; + notifyObservers(); + } + +} diff --git a/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherDisplay.java b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherDisplay.java new file mode 100644 index 0000000..94b0ca9 --- /dev/null +++ b/src/main/java/ru/lconnected/patternexamples/behavioral/observer/WeatherDisplay.java @@ -0,0 +1,34 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +import java.util.Date; + +/** + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public class WeatherDisplay implements Observer { + + private WeatherData weatherData; + private float temperature; + private float humidity; + private int pressure; + + public WeatherDisplay(WeatherData weatherData) { + this.weatherData = weatherData; + this.weatherData.registerObserver(this); + } + + @Override + public void update(float temperature, float humidity, int pressure) { + this.temperature = temperature; + this.humidity = humidity; + this.pressure = pressure; + display(); + } + + public void display() { + System.out.printf("["+new Date()+"] Сейчас значения:%.1f градусов цельсия и %.1f %% влажности. Давление %d мм рт. ст.\n", temperature, humidity, pressure); + } + +} diff --git a/src/test/java/ru/lconnected/patternexamples/behavioral/observer/ObserverTest.java b/src/test/java/ru/lconnected/patternexamples/behavioral/observer/ObserverTest.java new file mode 100644 index 0000000..3819a7d --- /dev/null +++ b/src/test/java/ru/lconnected/patternexamples/behavioral/observer/ObserverTest.java @@ -0,0 +1,34 @@ +package ru.lconnected.patternexamples.behavioral.observer; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Демонстрирует как классы WeatherDisplay и TemperatureConverter реагирую на события, + * происходящие в классе WeatherData + * Created by lkhruschev on 11.11.2016. + * lkhruschev@alvioneurope.ru + * Skype: levasfx + */ +public class ObserverTest { + + private WeatherData weatherData; + private WeatherDisplay weatherDisplay; + private TemperatureConverter temperatureConverter; + + @Before + public void setUp() { + weatherData = new WeatherData(); + weatherDisplay = new WeatherDisplay(weatherData); + temperatureConverter = new TemperatureConverter(weatherData); + } + + @Test + public void testUpdate() throws Exception { + weatherData.setMeasurements(29f, 65f, 745); + weatherData.setMeasurements(39f, 70f, 760); + weatherData.setMeasurements(42f, 72f, 763); + } +} \ No newline at end of file