一. 前言 1. 定义 Observer Pattern:定义对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。
观察者模式又被称作发布/订阅模式。
二. 代码实战 1. 概况 很多人们都在等待放假的信息,它们作为观察者,当放假的信息一出来的时候就需要知道放假的信息。
2. 代码 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 public class MyClass { public interface Observer { void receiveMessage (String message) ; } public static class Person implements Observer { public String name; public String type; public Person (String name, String type) { this .name = name; this .type = type; } public Person (String name) { this .name = name; } @Override public void receiveMessage (String message) { System.out.println(name+"使用" +type+"收到了信息:" +message); } } public interface Observable { void addObserver (Observer observer) ; void removeObserver (Observer observer) ; void notifyObserver (String message) ; } public static class DataCenter implements Observable { List<Observer> observers = new ArrayList<>(); @Override public void addObserver (Observer observer) { observers.add(observer); } @Override public void removeObserver (Observer observer) { observers.remove(observer); } @Override public void notifyObserver (String message) { for (Observer observer : observers) { observer.receiveMessage(message); } } } public static void main (String[] args) { Person person1 = new Person("张三" , "QQ" ); Person person2 = new Person("李四" , "微信" ); Person person3 = new Person("王二麻" , "信息" ); DataCenter dataCenter = new DataCenter(); dataCenter.addObserver(person1); dataCenter.addObserver(person2); dataCenter.addObserver(person3); dataCenter.notifyObserver("五月一号放五天假" ); } }
1 2 3 4 张三使用QQ收到了信息:五月一号放五天假 李四使用微信收到了信息:五月一号放五天假 王二麻使用信息收到了信息:五月一号放五天假
3. 系统中的例子 1 2 3 4 5 6 7 8 9 Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick (View arg0) { Log.d("test" , "Click button " ); } });
上面代码中,button
就是具体的主题,也就是被观察者;new
出来的View.OnClickListenerd
对象就是具体的观察者;OnClickListener
实际上就是个接口,也就是抽象观察者;通过setOnClickListener
把观察者注册到被观察者中。
一旦button
捕获的点击事件,即状态发生变化的时候,就会通过回调注册的OnClickListener
观察者的onClick
方法会来通知观察者,Button
状态发生变化。
三. 优缺点以及应用场景 1. 优点
2. 缺点
3. 应用场景
当一个对象的改变需要通知其它对象改变时,而且它不知道具体有多少个对象有待改变时。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁
跨系统的消息交换场景,如消息队列、事件总线的处理机制。
参考文章 Android的设计模式-观察者模式