1、基本介绍
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 如何解决:使用面向对象技术,可以将这种依赖关系弱化。 关键代码:在抽象类里有一个 ArrayList 存放观察者们。 应用实例: 1、老板由睡觉状态改成醒来状态,工人们由此开始更努力干活。
2、具体实现
我们这里以老板、工人为例。老板开始在睡觉,后来醒了。工人观察到老板醒了,开始卖力干活。
定义抽象观察者
public interface Observer {// 更新public void update();}
定义具体观察者
public class WorkerObserver implements Observer {@Overridepublic void update() {System.out.println("工人观察到老板醒了,开始努力干活");}}
定义主题 ```java public class Subject {
// 观察者数组 private List
oVector = new ArrayList<>(); // 增加一个观察者 public void addObserver(Observer observer) {
this.oVector.add(observer);
}
// 删除一个观察者 public void deleteObserver(Observer observer) {
this.oVector.remove(observer);}
// 通知所有观察者 public void notifyObserver() {
for (Observer observer : this.oVector) { observer.update(); }}
}
- 定义具体主题(老板)
```java
public class BossSubject extends Subject {
// 老板睡醒了
public void wakeUp() {
System.out.println("老板睡醒了,并且所有工人都观察到了");
super.notifyObserver();
}
}
- 测试
public class Demo { public static void main(String[] args) { // 创建一个主题,这里指的老板 BossSubject subject = new BossSubject(); // 定义一个观察者,这里指的工人 Observer observer = new WorkerObserver(); // 观察,这个老板的身上,有很多只眼睛在观察他~~~~~~ subject.addObserver(observer); // 老板醒了,工人开始卖力干活 subject.wakeUp(); } }
