一、什么是观察者模式
观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
二、观察者模式介绍
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
三、安卓全局接收消息例子中的观察者模式
github链接:https://github.com/jackiesea/SubjectObserver
observer接口和subject接口:
observer抽象类定义了所有观察者都拥有的更新界面,用来接收目标发出的更新通知;subject抽象类提供一个让观察者进行添加与移除的方法,notify函数的作用是利用观察者提供的更新函数来通知自己此时目标已经产生变化。
public interface Observer {
void update(String info);
}
public interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
观察者实例:
当目标对象改变时,会调用它自己的通知函式来将通知发送给每一个观察者对象。通知与更新函式有时可能会有一些参数,指明目前目标对象内的何种改变,这样可以增加观察者的效率(只更新那些改变部分的状态)。
public class StudentObserver implements Observer {
private TeacherSubject teacherSubjectInstance;
private String observerName;
//每个观察者可以把得到的主题回调信息给上层activity使用
private CallBack callBack;
public StudentObserver(String observerName, TeacherSubject
teacherSubject, CallBack callBack) {
this.observerName = observerName;
this.teacherSubjectInstance = teacherSubject;
this.callBack = callBack;
teacherSubject.addObserver(this);
}
@Override
public void update(String subject) {
callBack.onResponse(observerName + " 变化的主题是:" + subject);
}
}
被观察的主体实例:
在主体更改状态时,有两种方法将数据从主体传递给观察者,本例中采用的是主动推送的方式,一旦有了新的内容,就调用notifyObserver方法通知所有的观察者,虽然有时可能会发送大量数据并且观察者并不使用全部的数据。
public class TeacherSubject implements Subject {
//保存观察者
private List<Observer> observers = new ArrayList<>();
private String subject;
//改成单例模式,让所有activity都可以获得
public static TeacherSubject mTeacherSubjectInstance;
public static TeacherSubject getTeacherSubjectInstance() {
if (mTeacherSubjectInstance == null) {
mTeacherSubjectInstance = new TeacherSubject();
}
return mTeacherSubjectInstance;
}
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = observers.indexOf(observer);
if (i >= 0) {
observers.remove(observer);
}
}
@Override
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer) observers.get(i);
observer.update(subject);
}
}
//发布主题,通知所有观察者
public void publicSubject(String subject) {
this.subject = subject;
Log.e("", "发布的主题是:" + subject);
this.notifyObserver();
}
}
MainActivity:
创建观察者和主体,并通过StudentObserver的构造函数将二者绑定在一起。
public class StudentObserver implements Observer { private TeacherSubject teacherSubjectInstance; private String observerName; //每个观察者可以把得到的主题回调信息给上层activity使用 private CallBack callBack; public StudentObserver(String observerName, TeacherSubject teacherSubject, CallBack callBack) { this.observerName = observerName; this.teacherSubjectInstance = teacherSubject; this.callBack = callBack; teacherSubject.addObserver(this); } @Override public void update(String subject) { callBack.onResponse(observerName + " 变化的主题是:" + subject); } }
被观察的主体实例:
在主体更改状态时,有两种方法将数据从主体传递给观察者,本例中采用的是主动推送的方式,一旦有了新的内容,就调用notifyObserver方法通知所有的观察者,虽然有时可能会发送大量数据并且观察者并不使用全部的数据。
public class TeacherSubject implements Subject { //保存观察者 private List<Observer> observers = new ArrayList<>(); private String subject; //改成单例模式,让所有activity都可以获得 public static TeacherSubject mTeacherSubjectInstance; public static TeacherSubject getTeacherSubjectInstance() { if (mTeacherSubjectInstance == null) { mTeacherSubjectInstance = new TeacherSubject(); } return mTeacherSubjectInstance; } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int i = observers.indexOf(observer); if (i >= 0) { observers.remove(observer); } } @Override public void notifyObserver() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer) observers.get(i); observer.update(subject); } } //发布主题,通知所有观察者 public void publicSubject(String subject) { this.subject = subject; Log.e("", "发布的主题是:" + subject); this.notifyObserver(); } }
MainActivity:
创建观察者和主体,并通过StudentObserver的构造函数将二者绑定在一起。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TeacherSubject teacherSubject = TeacherSubject.getTeacherSubjectInstance(); StudentObserver studentObserver1 = new StudentObserver("观察者1号", teacherSubject, callback); StudentObserver studentObserver2 = new StudentObserver("观察者2号", teacherSubject, callback); StudentObserver studentObserver3 = new StudentObserver("观察者3号", teacherSubject, callback); teacherSubject.publicSubject("NewSubject");*/ }