1、概述
观察者模式又称为发布/订阅(Publish/Subscribe)模式
观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer)
(1)Subject模块
Subjec模块有3个主要操作
addObserver():注册添加观察者(申请订阅)
deleteObserver():删除观察者(取消订阅)
notifyObserver():通知所有的观察者对象
isChange() : 主题状态发生变化时通知所有的观察者对象
(2)Oserver模块
Observer模块有1个核心操作update(),
当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知
二 UML图
三 实例
interface Observe 观察者接口
public interface Observer {
void handle();
}
class MonObserver implements Observer 观察者实现类
public class MonObserver implements Observer{
@Override
public void handle() {
System.out.println("Mon 喂");
}
}
class DadObserver implements Observer 观察者实现类
public class DadObserver implements Observer{
@Override
public void handle() {
System.out.println("Dad抱抱");
}
}
interface Subject 主题接口(被观察者)
public interface Subject {
void addObserver(Observer observer);
void deleteObserver(Observer observer);
void notifyObserver();
}
class Child implements Subject 主题实现类
public class Child implements Subject{
private List<Observer> list = new ArrayList<>();
private boolean cry;
public void setCry(boolean cry) {
this.cry = cry;
isCry();
}
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObserver() {
for (int i = 0; i < list.size(); i++) {
Observer observer = list.get(i);
observer.handle();
}
}
public void isCry(){
if (cry){
notifyObserver();
}
}
}
客户端
public class Client {
public static void main(String[] args) {
MonObserver monObserver = new MonObserver();
DadObserver dadObserver = new DadObserver();
Child child = new Child();
child.addObserver(monObserver);
child.addObserver(dadObserver);
child.setCry(true);
}
思考 :
1 将事件本身具化为类进行封装 , 当状态发生变化时,将事件类当做参数传递给观察者进行处理
2 在观察者之间相互传递,形成一个链,有序处理