android设计模式学习笔记(何红辉,关爱民)
1、观察者模式
1、Subject抽象主题
抽象主题,也就是被观察者(Observable)的角色,抽象主题角色把所以观察者对象保存到一个集合中,每个主题都可以有任意观察者的数量,抽象主题提供一个接口,可以增加和删除观察者对象。
2、ConcreteSubject具体主题
具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题以又叫具体被观察者。
3、Observer抽象观察者
抽象观察者,它定义一个更新的接口,使得在得到主题的更改通知时更新自己。
4、ConcreteObserver具体观察者
该角色实现抽象观察者角色定义的更新接口,以便在主题发生改变时更新自己的状态。
代码如下:
1、观察者
public interface Watcher {
void update(String str);
}
2、观察者具体实现
public class TestWatcher implements Watcher {
@Override
public void update(String str) {
System.out.println(str);
}
}
3、被观察者
/**
* 被观察者
*/
public interface Watched {
void addWatcher(Watcher wacher);
void removeWatcher(Watcher wacher);
void notifyWatchers(String str);
}
4、具体被观察者
package com.example.watcherdemo;
import java.util.ArrayList;
import java.util.List;
/**
* 具体被观察者
*/
public class TestWatched implements Watched {
private List<Watcher> list=new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher wacher) {
list.add(wacher);
}
@Override
public void removeWatcher(Watcher wacher) {
list.remove(wacher);
}
@Override
public void notifyWatchers(String str) {
for(Watcher watcher:list){
watcher.update(str);
}
}
}
测试代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//被观察者
Watched hitef = new TestWatched();
//观察者
Watcher watcher1 = new TestWatcher();
Watcher watcher2 = new TestWatcher();
Watcher watcher3 = new TestWatcher();
hitef.addWatcher(watcher1);
hitef.addWatcher(watcher2);
hitef.addWatcher(watcher3);
//当被观察者小偷偷东西的时候,通知观察者,然后做出相应的事件处理。
hitef.notifyWatchers("小偷偷东西");
}
}
运行结果
3、观察者与Rxjava
从纯java的观点看,Rxjava Observable类来自GOF观察者模式
它添加了三个缺少的功能:
- 生产者在没有更多数据可用时能够发出信号通知:onComplete()
- 生产者了生错误时了出信号通知:onError()事件
- Rxjava Obsrvables能够组合而不是嵌套,从而避免开发者陷入回调的地狱。