import java.util.ArrayList;
import java.util.List;

/**
 * {@link <a href=
 * "https://[Log in to view URL]"
 * target= "_blank"></a>}
 * 
 * @author itammb ( Italia Massimiliano Buscati )
 * @version JDK 1.15
 *
 */
class Main {

	public interface Publisher {
		// primitive di gestione notifica
		void addSubscriber(Subscriber subscriber);

		void removeSubscriber(Subscriber subscriber);

		void notifySubscribers();
	}

	public static class  WeatherStation implements Publisher {
		private List<Subscriber> subscribers;
		private float temperature;
		private float humidity;

		public WeatherStation() {
			this.subscribers = new ArrayList<>();
		}

		@Override
		public void addSubscriber(Subscriber subscriber) {
			subscribers.add(subscriber);
		}

		@Override
		public void removeSubscriber(Subscriber subscriber) {
			subscribers.remove(subscriber);
		}

		@Override
		public void notifySubscribers() {
			for (Subscriber subscriber : subscribers) 
				subscriber.update(temperature, humidity);
		}

		public void setMeasurements(float temperature, float humidity) {
			this.temperature = temperature;
			this.humidity = humidity;
			// notifica a tutti i sotoscrittori il cambiamento di stato
			notifySubscribers(); 
		}
	}

	public interface Subscriber {
		void update(float temperature, float humidity);
	}

	public static class WeatherDisplay implements Subscriber {
		private float temperature;
		private float humidity;

		@Override
		public void update(float temperature, float humidity) {
			this.temperature = temperature;
			this.humidity = humidity;
			display();
		}

		public void display() {
			System.out.println("Current conditions: " + temperature + "C degrees and " + humidity + "% humidity");
		}
	}

	public static void main(String args[]) {
		// Unit test - uso del design pattern: observer
		WeatherStation weatherStation = new WeatherStation();

		// crea un sottoscrittore
		WeatherDisplay display1 = new WeatherDisplay();
		WeatherDisplay display2 = new WeatherDisplay();

		// registra un sottoscrittore per una notifica
		weatherStation.addSubscriber(display1);
		weatherStation.addSubscriber(display2);
		
		// simula il cambiamento di stato e il meccanismo di notifica
		weatherStation.setMeasurements(25.5f, 65.0f);
		weatherStation.setMeasurements(27.3f, 70.0f);
	}
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: