Observer pattern can be applied when there's data source and multiple data receivers, it fulfills OCP and it's easy to extend/maintain data receiver list.
Data source will mainly implement 3 methods, regisiter data receiver, remove data receiver and update data.
Data source will have a data receivers list, use register and remove 2 methods to maintain the list, update method to update and request all registered observer to display updated latest data.
public interface IChannel {
void registerObserver(IObserver observer);
void removeObserver(IObserver observer);
void updateInfo(double temperature, double pressure, double humility);
}
/**
* @Author Carter Deng
* @Date 2021/11/23
*/
public class WeatherChannel implements IChannel {
List<IObserver> observers;
public double temperature;
public double pressure;
public double humility;
public WeatherChannel() {
this.observers = new ArrayList<IObserver>();
}
@Override
public void registerObserver(IObserver observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(IObserver observer) {
this.observers.remove(observer);
}
@Override
public void updateInfo(double temperature, double pressure, double humility) {
this.temperature = temperature;
this.pressure = pressure;
this.humility = humility;
observers.forEach(observer -> {
observer.display(temperature, pressure, humility);
});
}
}
Observer side just simply provides display method, it will display the latest data coming from data source,
/**
* @Author Carter Deng
* @Date 2021/11/23
*/
public class Baidu implements IObserver{
@Override
public void display(double temperature, double pressure, double humility) {
System.out.println("====Baidu Website====");
System.out.println("Baidu Website - temperature: " + temperature);
System.out.println("Baidu Website - pressure: " + pressure);
System.out.println("Baidu Website - humility: " + humility);
}
}
When we want to extend data receivers list, it will be very simple, just newly register one data receiver (Sina) under data source maintained observer list.
/**
* @Author Carter Deng
* @Date 2021/11/23
*/
public class Test {
public static void main(String[] args) {
IChannel weatherChannel = new WeatherChannel();
IObserver baidu = new Baidu();
IObserver sina = new Sina();
weatherChannel.registerObserver(baidu);
weatherChannel.registerObserver(sina);
weatherChannel.updateInfo(20,1,30);
}
}