Head First 设计模式笔录--观察者模式

观察者模式定义了一种一对多的依赖关系,当一个对象改变状态时,他的所有依赖者都会收到通知并更新数据。

比如我们常见的设置监听,button.setOnClickListener也算是观察者的一种。

核心关注点

观察者与被观察者是松耦合的,被观察者只需要知道,观察者都实现了统一的接口,都提供了update的方法。只要接口不变,改变任何一方的内容,都不会对另一方造成影响。

被观察者中持有观察者的list,发生数据变化就通知到list中的所有观察者,注意解除观察的时候及时移除观察者,避免内存泄漏.

气象站的故事情景

X公司与气象台合作,气象台会提供一个WeatherData对象,该对象会追踪当前的天气状况,温度,湿度,气压三种。要求X公司提供系统,可以接入不同的布告板展示数据,要求第三方任意公司都可以创建布告板,接入并展示气象台的数据。

我们定义了主题接口(被观察者接口),声明了添加观察者,移除观察者,通知变化的方法。同时定义一个观察者接口,声明一个更新的方法。

 图中多了display接口,考虑到不同的布告板,显示不同的样式,效果,所以这里才有了该接口。

interface Observer {
    void update(float temp, float humidity, float pressure);
}


interface DisplayElement {
    void display(float temp, float h, float p);
}


public interface Subject {
    void registObserver(Observer observer);
    void removeOBserver(Observer observer);
    void notifyOBservers();
}

数据监控对象 

class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList<>();
    }

    @Override
    public synchronized void registObserver(Observer observer) {
        if (observers.contains(observer)) {
            return;
        }
        observers.add(observer);
    }

    @Override
    public synchronized void removeOBserver(Observer observer) {
        if (!observers.contains(observer)) {
            return;
        }
        observers.remove(observer);
    }

    @Override
    public void notifyOBservers() {
        for (Observer o : observers) {
            o.update(temperature, humidity, pressure);
        }
    }

    private void measurementChanged() {
        notifyOBservers();
    }

    public void setMeasurements(float t, float m, float p) {
        this.temperature = t;
        this.humidity = m;
        this.pressure = p;
        measurementChanged();

    }
}

布告板

class CurrentConditionDisplay implements Observer, DisplayElement {
    private WeatherData mWeatherData;

    public CurrentConditionDisplay(WeatherData weatherData) {
        this.mWeatherData = weatherData;
        weatherData.registObserver(this);
    }

    @Override
    public void display(float temp, float h, float p) {
        System.out.println("布告板展示数据:温度:" + temp + "   湿度是:" + h + "   气压是:" + p);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        //获取到了数据,
        System.out.println("布告板收到数据更新的通知了");
        display(temp, humidity, pressure);
    }

    public void destroy() {
        mWeatherData.removeOBserver(this);
        mWeatherData = null;
    }
}
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);

weatherData.setMeasurements(30f, 20f, 1.0f);

java中内置了观察者模式,但是,java内置的Observable是一个类,在java单继承的情况下,一旦继承了Observable类,就无法继承其他类了。并且内部notifyObservers的方法,需要在状态changed为true的情况下才会发送通知,而该setChanged的方法是protected的,如果不是其子类就无法调用更改状态。属实是坑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Head First设计模式-深入浅出设计模式》是一本以简单有趣的方式介绍设计模式的书籍。设计模式是在软件开发中解决特定问题的一种经验总结,它们提供了在实际开发中可重用、可靠、灵活的解决方案。 该书的主要特点是通过生动有趣的讲解和丰富多样的图表、示例来帮助读者更好地理解和应用设计模式。作者采用了大量的图形和实例来解释设计模式的概念,使读者能够迅速理解并应用这些概念。 这本书涵盖了23种常用的设计模式,如工厂模式、单例模式、适配器模式、装饰器模式等。每一种设计模式都以一个实际的例子开始,引出该模式解决的问题,然后详细解释其结构和应用,最后通过示例代码展示如何使用该模式。 此外,该书还介绍了设计模式之间的关系和如何选择合适的设计模式。它教授了读者如何在具体问题中识别出适用的设计模式,并提供了一些实际的应用建议。 《Head First设计模式-深入浅出设计模式》以其独特的教学风格和简洁明了的讲解深受读者喜爱。这本书不仅适合初学者了解设计模式,也适合有一定经验的开发人员进一步提高他们的软件设计和编程能力。 总之,这本书以其生动有趣的讲解方式和大量的图表、实例为读者介绍了设计模式的基本概念和具体应用,是学习和理解设计模式的一本不可或缺的指南。 ### 回答2: 《Head First设计模式:深入浅出设计模式》是一本主要介绍软件设计模式的书籍。设计模式是在软件开发中经常出现的问题的解决方案,可以帮助开发人员更好地构建可重用、可扩展、可维护的代码。 这本书以深入浅出的方式介绍了23种常见的设计模式,通过生动有趣的讲解和大量的图形和实例,使读者能够更加轻松地理解和掌握设计模式。它采用了非传统的学习方式,通过讲故事、练习、谜题等方式将设计模式的概念和使用方法娓娓道来。 该书首先从简单的设计模式开始,引导读者逐步理解和掌握基础的设计原则和模式,如单例模式、工厂模式等。然后,逐渐深入介绍更复杂的模式,如装饰器模式、观察者模式、策略模式等。每个模式都通过具体的案例和代码示例进行讲解,帮助读者理解模式的思想和应用场景。 除了具体的设计模式之外,这本书还关注了如何将设计模式应用到现实的软件开发中。它探讨了如何根据不同的需求选择合适的设计模式,以及如何通过设计模式提高代码的质量和可维护性。 总的来说,《Head First设计模式:深入浅出设计模式》是一本非常有趣、易懂且实用的设计模式入门书籍。无论是初学者还是有一定经验的开发人员,都能从中获得有益的知识和经验,提高软件开发的能力和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值