1.初步认识
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新
观察者模式的结构图:
从别人那里借过来的图(https://www.jianshu.com/p/433fa9818812)
2.介绍
观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer)
(1)Subject模块(被观察者)
Subject模块有三个功能
- registerObserver(Observer onserver):注册添加观察者(申请订阅)
- unregisterObserver(Observer onserver):取消注册的观察者(取消订阅)
- notifyObserverUpdate (String notifyChange):主题模块发生改变,通知相应观察者
(2)Observer模块
Observer里面有一个更新操作update操作,当Subject被观察者状态改变时,将调用每个观察的update()方法,更新相应通知。
3.简单例子
(1)被观察者接口
package wyl.observer.dao;
public interface Subject {
/**
* 注册观察者
*/
void registerObserver(Observer observer);
/**
* 取消对观察者的注册
*/
void unregisterObserver(Observer observer);
/**
* 通知观察者当前状态已更新
*/
void notifyObserverUpdate(String notifyChange);
}
(2)被观察者接口实现类
package wyl.observer.impl;
import wyl.observer.dao.Observer;
import wyl.observer.dao.Subject;
import java.util.ArrayList;
import java.util.List;
public class SubjectImpl implements Subject {
// 存放观察者
List<Observer> observerList = new ArrayList<>();
String status = "";
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void unregisterObserver(Observer observer) {
if (observerList != null && observerList.contains(observer)) {
observerList.remove(observer);
}
}
@Override
public void notifyObserverUpdate(String notifyChange) {
for (int i = 0; i < observerList.size(); i++) {
Observer observer = observerList.get(i);
observer.update(notifyChange);
}
}
}
(3)观察者接口
package wyl.observer.dao;
public interface Observer {
/**
* 被观察者发生变化,更新通知
*/
void update(String status);
}
(4)被观察者接口实现类
package wyl.observer.impl;
import wyl.observer.dao.Observer;
public class ObserverImpl implements Observer {
public String name;
public ObserverImpl(String name) {
this.name = name;
}
@Override
public void update(String status) {
System.out.println(name + " : " +status);
}
}
(5)测试被观察者发生改变,观察者被通知
package wyl.observer;
import wyl.observer.dao.Observer;
import wyl.observer.dao.Subject;
import wyl.observer.impl.ObserverImpl;
import wyl.observer.impl.SubjectImpl;
public class test {
public static void main(String[] args) {
// 创建主题(被观察者)
Subject subject = new SubjectImpl();
//创建观察者
Observer observer1 = new ObserverImpl("jack");
Observer observer2 = new ObserverImpl("rose");
Observer observer3 = new ObserverImpl("mary");
//将观察者注册到被观察者中,等待被通知
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.registerObserver(observer3);
//更新主题(被观察者)的数据,通知注册进来的观察者
//subject.notifyObserverUpdate("subject当前发生了改变");
subject.notifyObserverUpdate("subject去订阅了新的书籍,包括《java从入门到精通》《java整洁之道》《数据库》");
}
}
测试结果1:
jack : subject当前发生了改变
rose : subject当前发生了改变
mary : subject当前发生了改变
测试结果2:
jack : subject去订阅了新的书籍,包括《java从入门到精通》《java整洁之道》《数据库》
rose : subject去订阅了新的书籍,包括《java从入门到精通》《java整洁之道》《数据库》
mary : subject去订阅了新的书籍,包括《java从入门到精通》《java整洁之道》《数据库》 }