一、观察者模式:
观察者模式是软件设计模式的一种,在这种模式中,一个目标对象管理所有依赖于它的观察者对象,并且在它本身的状态改变时主动发出通知,通常通过主动呼叫观察者所提供的方法来实现,这种设计模式通常被用来处理实时事件或消息系统。
三、实例介绍:
observer接口和subject接口:
observer抽象类定义了所有观察者都拥有的更新界面,用来接收目标发出的更新通知;subject抽象类提供一个让观察者进行添加与移除的方法,notify函数的作用是利用观察者提供的更新函数来通知自己此时目标已经产生变化。
1 public interface Observer {
2 void update(String info);
3 }
4 public interface Subject {
5 void addObserver(Observer observer);
6 void removeObserver(Observer observer);
7 void notifyObserver();
8 }
观察者实例:
当目标对象改变时,会调用它自己的通知函式来将通知发送给每一个观察者对象。通知与更新函式有时可能会有一些参数,指明目前目标对象内的何种改变,这样可以增加观察者的效率(只更新那些改变部分的状态)。
1 public class StudentObserver implements Observer {
2 private TeacherSubject teacherSubjectInstance;
3 private String observerName;
4 //每个观察者可以把得到的主题回调信息给上层activity使用
5 private CallBack callBack;
6 public StudentObserver(String observerName, TeacherSubject
7 teacherSubject, CallBack callBack) {
8 this.observerName = observerName;
9 this.teacherSubjectInstance = teacherSubject;
10 this.callBack = callBack;
11 teacherSubject.addObserver(this);
12 }
13 @Override
14 public void update(String subject) {
15 callBack.onResponse(observerName + " 变化的主题是:" + subject);
16 }
17 }
被观察的主体实例:
在主体更改状态时,有两种方法将数据从主体传递给观察者,本例中采用的是主动推送的方式,一旦有了新的内容,就调用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的构造函数将二者绑定在一起。
1 public class MainActivity extends AppCompatActivity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_main);
7 TeacherSubject teacherSubject =
8 TeacherSubject.getTeacherSubjectInstance();
9 StudentObserver studentObserver1 = new
10 StudentObserver("观察者1号", teacherSubject, callback);
11 StudentObserver studentObserver2 = new
12 StudentObserver("观察者2号", teacherSubject, callback);
13 StudentObserver studentObserver3 = new
14 StudentObserver("观察者3号", teacherSubject, callback);
15 teacherSubject.publicSubject("NewSubject");*/
16 }
四、优点
- 将数据发送到大量其他对象时非常高效;
- 不需要对主题进行修改以添加新的观察者,并且可以随时添加和删除观察者,并且可以实现各自的监听事件;
- 当抽象个体有两个互相依赖的层面时,观察者模式允许程序员单独地去变更与重复使用这些对象,而不会产生两者之间交互的问题;