最近在研究RxJava,其中将观察者模式用到极致。在继续深入学习之前我特意总结下观察者模式。
观察者模式(Observer)又称分发-订阅模式。即目标更新会使注册了的观察者发生更新。一个目标可以有多个观察者。是一种一对多的关系。
最简单的例子:
出版社发新书,读者收到消息可以读新书
这里出版社其实就是目标,而读者就是观察者。
编码实现:
抽象目标:抽象类或接口
抽象观察者:抽象类或接口
具体目标:抽象类或接口的继承或实现
具体观察者:抽象类或接口的继承或实现
抽象目标:
持有对观察者的引用,用来注册和取消注册订阅
//目标
public interface IObserver {
void register(ISubScribe subject);
void removeRegister(ISubScribe subject);
void sendMes();
}
抽象观察者
//观察者
public interface ISubScribe {
void update();
}
具体目标:
public class NewsPaper implements IObserver {
List<ISubScribe> list = new ArrayList<ISubScribe>();
public void register(ISubScribe subject) {
list.add(subject);
}
public void removeRegister(ISubScribe subject) {
if(list.indexOf(subject)>=0){
list.remove(subject);
}
}
public void sendMes() {
for (ISubScribe subject : list) {
subject.update();
}
}
}
具体观察者:
public class Reader implements ISubScribe {
String name;
public Reader(String name){
this.name = name;
}
public void update() {
// TODO Auto-generated method stub
System.out.println(name+" 收到最新报纸了");
}
}
实现:
public class MainTest {
public static void main(String[] args) {
NewsPaper newsPaper = new NewsPaper();
Reader reader1 = new Reader("小美");
Reader reader2 = new Reader("小盛");
Reader reader3 = new Reader("小占");
newsPaper.register(reader1);
newsPaper.register(reader2);
newsPaper.register(reader3);
newsPaper.sendMes();
//取消订阅
newsPaper.removeRegister(reader3);
newsPaper.sendMes();
}
}
输出结果:
小美 收到最新报纸了
小盛 收到最新报纸了
小占 收到最新报纸了
小美 收到最新报纸了
小盛 收到最新报纸了