- 观察者模式定义了一种一对多的关系,让多个观察者对象同时监听一个被观察者对象,当被观察者对象产生状态变化时,会通知所有观察者对象,使他们能够更新自己的状态.
- 这种模式与微信公众号类似,公众号是被观察者,微信用户是观察者,当微信公众号有更新内容时会通知所有微信用户更新.
- Subject:被观察者接口,提供增加观察者、删除观察者、更新状态等方法;
- ConcreteSubject:被观察者接口的实现,增加删除观察者、更新状态等方法的执行者;
- Observer:观察者的接口,提供更新状态等方法;
- ConcreteObserver:具体观察者,观察者接口的实现,在收到ConcreteSubject发出的更新状态通知时更新自身状态;
- 定义Subject
public interface Subject{
//增加观察者
public void attach(Observer observer);
//删除观察者
public void delete(Observer observer);
//通知观察者
public void notify(String msg);
}
- 实现Subject
public class ConcrereObserver implements Subject{
//储存观察者的集合
private List<Observer> observerList = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
observerList .add(observer);
}
@Override
public void detach(Observer observer) {
observerList .remove(observer);
}
@Override
public void notify(String message) {
for (Observer observer : observerList ) {
observer.update(message);
}
}
}
- 定义Observer
public interface Observer{
//更新消息
public void update(String msg);
}
- 实现Observer
public class ConcrereObserver implements Observer {
@Override
public void update(String message) {
System.out.println("观察者说:"+message);
}
}
- 调用下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public void init(){
ConcrereObserver observer1 = new ConcrereObserver();
ConcrereObserver observer2 = new ConcrereObserver();
ConcrereObserver observer3 = new ConcrereObserver();
ConcrereSubject subject = new ConcrereSubject();
subject.attach(observer1);
subject.attach(observer2);
subject.attach(observer3);
subject.notify("你们被包围了");
}
}
- 在Android中,OnClickListener、Adapter的notifyDataSetChanged、RxJava、RxAndroid、EventBus等都是使用观察者模式来实现的,不过在使用观察者模式的时候应注意,如果某个观察者发生了卡顿,会影响程序的整体执行,这种情况建议异步执行;