10 Android常见设计模式:观察者模式
2021-12-16 本文已影响0人
彩虹_直至黑白
前言
观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了。
定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
简单实现
我们以上课铃声响起,学生老师上课为例进行说明。
- 创建抽象被观察者
public interface Observable {
//添加观察者
void addObserver(Observer observer);
//移除观察者
void removeObserver(Observer observer);
//通知观察者
void notifyObserver(String msg);
}
- 创建抽象观察者
public interface Observer {
void action(String msg);
}
- 创建一个具体主题,即具体被观察者(上课铃声)
public class AlarmClock implements Observable {
//保存观察者对象
List<Observer> list = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
//通知观察者
@Override
public void notifyObserver(String msg) {
Log.d("AlarmClock", "notifyObserver: " + list.toString());
for (Observer observer : list) {
observer.action(msg);
}
}
}
- 创建具体观察者(学生,老师)
public class Students implements Observer {
private final String name;
public Students(String name) {
this.name = name;
}
@Override
public void action(String msg) {
Log.e("action", msg + name + ",开始听课");
}
}
public class Teacher implements Observer {
@Override
public void action(String msg) {
Log.e("action", msg + ",老师开始讲课");
}
}
- 调用展示结果
//创建被观察者
Observable alarmClock = new AlarmClock();
//创建观察者
Observer student1 = new Students("小屁孩");
Observer student2 = new Students("中屁孩");
Observer student3 = new Students("大屁孩");
Observer teacher = new Teacher();
//注册观察者
alarmClock.addObserver(teacher);
alarmClock.addObserver(student1);
alarmClock.addObserver(student2);
alarmClock.addObserver(student3);
//通知已注册的观察者
alarmClock.notifyObserver("上课铃声已经响了");
总结
观察者模式主要的作用就是对象解耦,将观察者与被观察者完全隔离,只依赖于Observer和Observable抽象。例如,ListView就是运用了Adapter和观察者模式使得它的可扩展性、灵活性非常强,而耦合度却很低,这是设计模式在Android源码中优秀运用的典范。