观察者模式常用于只要改变一个内容,其他的一个或多个内容也会随之改变。
例如需求:公司行政通知开会,领导需要准备发言,秘术做好会议记录,员工需要认真听讲。
这种需求使用观察者模式实现最合理。
观察者模式实现有两种方式,
方式一、使用Api直接提供的接口,我们只要实现它即可。
方式二、自定义一个观察者接口、被观察着接口、被观察者主体、观察者主体。
方式一简单代码实现:
1、定义被观察者类,继承Observable
需要观察的对象
public class MeetingObservable extends Observable {
public void startMeeting(String msg){
setChanged();
notifyObservers(msg);
}
}
2、定义观察者类,实现Observer接口
当需要观察的对象发生改变是,观察者需要作出的变化。
public class SecretaryObserver implements Observer {
@Override
public void update(Observable observable, Object o) {
Log.d("Secretary","接收到会议指令 "+o.toString() + " 秘术记录会议内容");
}
}
public class LeadObserver implements Observer {
@Override
public void update(Observable observable, Object o) {
Log.d("Lead",o.toString() + " 领导发言 ");
}
}
public class EmployeeObserver implements Observer {
@Override
public void update(Observable observable, Object o) {
Log.d("Employee",o.toString() + " 员工听讲");
}
}
3、使用方法
private void test(){
MeetingObservable observable = new MeetingObservable();
SecretaryObserver secretary = new SecretaryObserver();
LeadObserver lead = new LeadObserver();
EmployeeObserver employee = new EmployeeObserver();
observable.addObserver(secretary);
observable.addObserver(lead);
observable.addObserver(employee);
observable.startMeeting("开始会议");
}
方式二简单实现
1、定义观察者接口
用来更新观察者对象
public interface MyObserver {
public void upDate(Object object);
}
2、定义被观察者接口
public interface MyObservable {
public void addObserver(MyObserver observer);
public void delObserver(MyObserver observer);
public void delObservers();
public void notifyObserver(Object object);
}
3、定义被观察者主体
该方法主要用于添加、删除观察者,以及通知各个观察者进行更新。
public class Meeting implements MyObservable{
List<MyObserver> mList = new ArrayList<>();
@Override
public void addObserver(MyObserver observer) {
if (observer != null){
mList.add(observer);
}
}
@Override
public void delObserver(MyObserver observer) {
if (observer != null){
mList.remove(observer);
}
}
@Override
public void delObservers() {
if (mList != null && mList.size() > 0){
mList.clear();
}
}
@Override
public void notifyObserver(Object object) {
for (MyObserver observer : mList){
observer.upDate(object);
}
}
}
4、定义观察者主体
实现观察者接口,实现各个观察者接收到通知消息后需要进行的操作。
public class Employee implements MyObserver {
@Override
public void upDate(Object object) {
Log.d("employee", object.toString() + " 各位员工注意听讲");
}
}
public class Manager implements MyObserver {
@Override
public void upDate(Object object) {
Log.d("manager", object.toString() + " 领导讲话 ");
}
}
5、使用方法
private void test(){
Meeting meeting = new Meeting();
Manager manager = new Manager();
Employee employee = new Employee();
meeting.addObserver(manager);
meeting.addObserver(employee);
meeting.notifyObserver("员工大会现在开始");
//使用完毕之后需要消除观察者
meeting.delObservers();
}