HeadFirst学习之观察者模式

    xiaoxiao2021-08-17  110

           观察者模式的定义为:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到一个通知并自动更新。        观察者模式理解上并没有什么困难,还是举个超市买水果的例子。假设小陈和老王想要买到便宜的苹果,那么苹果就是我们要关注的主题(Subject),观察者也就是小陈和老王(Observer),当苹果价格改变时,那么就会去通知小陈和老王,让他们做自己该做的事情。大体上就是这样的流程,下面就是类和类之间关系的设计。        由于我们不确定观察的对象,因为有可能今天我关注苹果,明天我关注西瓜,所以被观察者(Subject)应设计为一个接口,功能有注册、移除观察者、修改、通知等操作;而且很有可能不止小陈和老王关注苹果,张三也关注苹果,所以观察者(Observer)也要设计成接口,这样代码的扩展性就很高了。首先我们定义Subject接口:

    public class Subject { public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void modifyPrice(Integer price); public void notifyObserver(); }

    然后我们定义Observer接口:

    public interface Observer { public void update();//当被观察者改变时,观察者应当去做的事 }

    然后我们写一个Subject的实现类Apple,其代码如下:

    public class Apple implements Subject{ private ArrayList<Observer> observers;//观察者列表,考虑到了多个观察者的情况 private Integer price; public Apple(Integer price){ this.price = price; observers = new ArrayList<Observer>();//初始化观察者列表 } //注册观察者,也就是让观察者加入到被观察者通知队伍中 public void registerObserver(Observer observer){ observers.add(observer); } //移除观察者 public void removeObserver(Observer observer){ int index = observers.indexOf(observer); if(index != -1){ observers.remove(index); } } //价格修改,也就是我们在意的事件 public void modifyPrice(Integer price){ System.out.println("价格马上就要修改了,原价:"+this.price+",现价:"+price); this.price = price; notifyObserver();//价格修改后通知观察者 } //通知观察者方法,循环列表通知所有观察者 public void notifyObserver(){ for(Observer observer : observers){ observer.update(); } } }

    在之后就是Observer的一个实现类ObserverA和ObserverB,代码如下:

    //ObserverA public class ObserverA implements Observer{ @Override public void update() { System.out.println("我是观察者A,苹果降价了!!!"); } } //ObserverB public class ObserverB implements Observer{ @Override public void update() { System.out.println("我是观察者B,苹果降价了!!!"); } }

    最后是进行测试的类Supermarket:

    public class Supermarket { public static void main(String[] args) { Apple apple = new Apple(2);//new一个单价为2的目标(主题) apple.registerObserver(new ObserverA());//为apple注册一个观察者A apple.registerObserver(new ObserverB());//为apple注册一个观察者B apple.modifyPrice(1);//修改苹果价格 } } //执行结果如下: 价格马上就要修改了,原价:2,现价:1 我是ObserverA,苹果降价了!!! 我是ObserverB,苹果降价了!!!

           观察者模式的思想较为接近现实生活,所以并不是很难理解,最主要的是记住Subject中持有多个Observer,这样在发生变化时才能去逐一通知。另外还有一种观察者模式是采用观察者拉取数据,原理上大同小异,不过个人感觉这种方式不太好,在这里不写了。        还有一点需要说明的是Java中内置了观察者模式,在java.util包下的Observer接口和Observable类(Subject接口),这个观察者模式和我们所写的最大的区别就是:将Subject变成了一个类,这样会限制我们的使用和复用,因为java是单继承,有兴趣的同学可以去看一下。        设计原则是“多用组合,少用继承”,这样我们的代码将会更加灵活。

    转载请注明原文地址: https://ju.6miu.com/read-676540.html

    最新回复(0)