Observer Pattern

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值