字节跳动飞书内推!
北京、杭州、武汉、广州、深圳、上海,六大城市等你来投。
感兴趣的朋友可以私我咨询&内推,也可以通过链接直接投递!
海量HC,极速响应,快来和我成为同事吧。
今日头条、抖音、Tik Tok也可以内推~
点击进入我的博客
1 简介
观察者模式是对象的行为模式,又叫做发布-订阅( Publish/ Subscribe)模式、模型-视图( Model/View)模式、源-监听器( Source/Listener)模式或从属者( Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自
2 结构
- 抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。
- 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。
- 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫作具体被观察者角色(ConcreteObservable)。
- 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题对象的引用。
3 代码
在Java语言的java.util库里面,提供了一个Observable类以及一个Observer接口,构成Java语言对观察者模式的支持。
观察者:Observer接口
这个接口只定义了一个方法,即update()方法。当被观察者对象的状态发生变化时,被观察者对象的notifyObservers()方法就会调用这一方法。
被观察者:Observable类
被观察者类都是java.util.Observable类的子类。 java.util.Observable提供公开的方法支
持观察者对象:
- setChanged():被调用之后会设置一个内部标记变量,代表被观察者对象的状态发生了变化。
- notifyObservers():被调用时,会调用所有登记过的观察者对象的updated方法,使这些观察者对象可以更新自己。
- addObserver():将对象一个一个地加入到一个聚集上。
4 例子
public class Main {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Student student = new Student(teacher);
teacher.writingOnBlackboard();
}
}
// 老师(被观察者)在黑板上写东西
class Teacher extends Observable {
public void writingOnBlackboard() {
System.out.println("1 + 1 = 2");
setChanged();
notifyObservers();
}
}
// 学生(观察者)观察老师写的东西并作出相应
class Student implements Observer {
public Student(Observable o) {
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.println("I know!");
}
}