观察者模式是使用率非常高的模式之一,常用在 GUI 系统、订阅–发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。比如:EventBus、Otto、RxJava 响应式编程其核心都是使用观察者模式。
定义
观察者模式是一种行为类模式,它定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
Android中源码使用观察者模式
1.BaseAdapter
特点
优点
(1)观察者和被观察者之间是抽象耦合,应对业务变化。
(2)增强系统的灵活性和可扩展性。缺点
在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在 Java 中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。
使用场景
- 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
- 事件多级触发场景。
- 跨系统的消息交换场景,如消息队列、事件总线的处理机制。
简单实现
需求:电视剧更新推送给小伙伴。
1. 观察者类
/**
* Created on 2019/4/11 11:26
*
* 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
*
*/
public interface Observer {
void update(String message);
}
------------------------------------
/**
* Created on 2019/4/11 11:29
*
* 具体观察者类 即订阅者
*
*/
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
Log.d("TAG", name + "," + message + "更新啦");
}
}
2. 被观察者类
/**
* Created on 2019/4/11 11:27
* 抽象被观察者类
*
*/
public interface Observable {
void push(String message); //推送消息
void register(Observer observer); //订阅
}
------------------------------------
/**
* Created on 2019/4/11 11:32
* 具体的被观察者类
*/
public class Teleplay implements Observable {
private List<Observer> mList = new ArrayList<>();
@Override
public void push(String message) {
for (Observer observer : mList) {
observer.update(message);
}
}
@Override
public void register(Observer observer) {
mList.add(observer);
}
}
3. 使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
Teleplay teleplay = new Teleplay();
User user1 = new User("小敏");
User user2 = new User("二狗");
User user3 = new User("小度");
//订阅
teleplay.register(user1);
teleplay.register(user2);
teleplay.register(user1);
teleplay.push("大江大河电视剧");
}
}
4. 结果
2019-04-11 11:42:55 D/TAG: 小敏,大江大河电视剧更新啦
2019-04-11 11:42:55 D/TAG: 二狗,大江大河电视剧更新啦
2019-04-11 11:42:55 D/TAG: 小敏,大江大河电视剧更新啦