Java设计模式之观察者模式(发布-订阅模式)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java设计模式之观察者模式(发布-订阅模式)
1.初步认识
在对象之间定义了⼀对多的依赖,这样⼀来,当⼀个对象改变状态,依赖它的对象会收到通知并⾃动更新
观察者模式的结构图:
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) {
= 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整洁之道》《数据库》}。