设计模式----观察者模式在 Android 中的影子

一.简介

观察者模式的实现就是有两个角色,一个是观察者( 比如有观察者 a, b , c ),一个是被观察者(比如有被观察者 d ),他们之间存在这样的一种关系,被观察者一旦某些状态改变,就会通知观察者甚至引起被观察者的一些行为的产生。比如 前面说的 a , b , c 他们观察这 d 的 大小写变化,一旦 d 变成了 D ,就会通知 被观察者 a, b, c , 而被观察者就可以因此得知 d 的改变,也可以因此产生一些行为比如 自己也变大写。

image.png

《Android 源码设计模式》中的定义是:定义对象一种一对多的依赖关系,使得每当一个对象改变状态,则所有的依赖于它的对象会得到通知并自动更新,通常为一种发布 –订阅的系统。

二.使用场景

  • 1.关联行为场景,这种行为是可以拆分的,比如上文的大小写的行为。
  • 2.事件多级触发,比如 a ,b , c, 按顺序触发变成大写的操作。
  • 3.跨系统的消息交换场景,消息队列,事件总线 EventBus 等,比如 Android 中的广播机制。

三.在 Java 中的实现例子

  • Observer ,观察者,在 Java 9 后废弃
  • Observable ,被观察者 ,在Java 9 后废弃

虽然上面两个 接口已经废弃但是这并不影响体会 观察者模式的应用,因为这并不是观察者模式的一种唯一写法。实际上,作为一种设计模式,精华的其设计思想而不是实现细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//码农是观察者,观察一些 IT 信息
public class CoderObserver implements Observer {
public String name;

public CoderObserver(String name) {
this.name = name;
}

@Override
public void update(Observable o, Object arg) {
System.out.println(name+"更新"+arg);
}

@Override
public String toString() {
return "码农"+name;
}
}

//IT 信息是被观察者,一旦有信息就会通知观察者
public class MessageObservable extends Observable {
public void postMessage(String content) {
setChanged();
notifyObservers(content);

}
}

public class Test {
public static void main(String[] args) {
MessageObservable messageObservable = new MessageObservable();
CoderObserver coderObserver = new CoderObserver("No0");
CoderObserver coderObserver1 = new CoderObserver("No1");
CoderObserver coderObserver2 = new CoderObserver("No2");

messageObservable.addObserver(coderObserver);
messageObservable.addObserver(coderObserver1);
messageObservable.addObserver(coderObserver2);

messageObservable.postMessage("新的消息发布");
}
}

执行结果

1
2
3
4

No2更新新的消息发布
No1更新新的消息发布
No0更新新的消息发布

四.Android 中的体现

观察模式在 Android 中是一种常见的设计模式。

  • ListView/RecycklerView 中 的 Adapter, 对于 notifyDataSetChanged 这个方法每次调用都会通知各个item 刷新数据。就是一个观察者模式,其中数据是一个被观察者,每个 item 就是一个观察者。
  • 广播的发布和广播接收者的接收 也是一个观察者模式的体现,或者说成一种订阅-发布更加合适,每一个订阅者订阅自己想要的广播,每一个广播都是一个发布者,且通过系统进行中转/转发,从而实现了观察者这种模式,因为这种信息的传递时跨进程的,因此称这种方式为
    跨系统的消息交换场景。详见Android 广播的流程
  • 观察者一些重要的实践在于一些开源的框架,EventBus ,Otto 等,简化了组件之间的交互,从而降低了耦合。
0%