安卓中的观察者模式解析

1.观察者模式介绍

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。除此之外,观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

 

2.实例介绍

 

  首先 我们先要知道,观察者模式中主要有观察者和被观察者2个对象,而在观察模式中Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。 当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。

  当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多观察者(实现了Observer)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。

被观察者:

Android 使用观察者模式 安卓 观察者模式_观察者模式

 

  该类继承了Observable类,因此MyPerson是一个被观察者。它通过setChanged()告知数据改变,通过notifyObservers()发送信号通知观察者自己发生变化了。

观察者:

Android 使用观察者模式 安卓 观察者模式_数据_02

 

  该类实现了Observer,因此是个观察者。当我们接受到上面发送的信号时,update()方法就会被调用,从而执行动作。

主代码中的通过myObservers.add(myObserver)添加观察者和通过change通知数据改变的部分如下:

 

Android 使用观察者模式 安卓 观察者模式_Android 使用观察者模式_03

 

带来的好处:

  1. 当两个对象之间送耦合,他们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间送耦合。主题所知道只是一个具体的观察者列表,每一个具体观察者都符合一个抽象观察者的接口。主题并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。
  2. 观察者模式支持“广播通信”。主题会向所有的观察者发出通知。
  3. 观察者模式符合“开闭原则”的要求。