(一)理解观察者模式
像是订阅号一样,当发布者(主题)发布新消息的时候,所有订阅的用户(观察者)都会接收到新消息。当取消订阅(撤销)之后,发布者更新消息不会影响,反之想要接收消息需要先订阅(注册主题)
*另外java自带了一套封装好的观察者模式此篇文章只是帮助理解
(二)主要组成
- Subject接口:主题接口,主要方法有registerObserver(注册观察者)、removeObserver(撤销观察者)、notifyObserver(当数据发生变化时用于通知观察者)
- Subject实现类:具体的主题,数据源。就像微信订阅的公众号,报社
- Observer接口:至少一个update方法(当主题数据发生变化调用此方法)
- Observer实现类:具体的观察者
(三)代码部分
主题代码
/**
* @author zzz
* @date 2020/3/12 14:41
*/
//主题接口,所有具体主题必须实现
//用于观察者注册,注销,当数据发生变化通知所有/部分观察者
interface Subject {
//注册观察者
public void registerObserver(Observer o);
//撤销观察者
public void removeObserver(Observer o);
//通知观察者
public void notifyObserver();
}
//具体主题类
class newsPaperOffice implements Subject{
public ArrayList<Observer> observers = new ArrayList<>();
public newsPaperOffice(){};
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i > -1){
observers.remove(i);
}
}
@Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.update();
}
}
public void provide(){
notifyObserver();
}
}
观察者代码
/**
* @author zzz
* @date 2020/3/12 14:53
* 观察者接口所有观察者实现此接口
*/
interface Observer {
public void update();
}
//A号 观察者
class personA implements Observer{
@Override
public void update() {
System.out.println("AAA 我收到最新新闻");
}
}
//B号 观察者
class personB implements Observer{
@Override
public void update() {
System.out.println("BBB 我收到最新新闻");
}
}
//C号 观察者
class personC implements Observer{
@Override
public void update() {
System.out.println("CCC 我收到最新新闻");
}
}
测试代码
/**
* @author zzz
* @date 2020/3/12 15:19
*想要接受通知必须要先进行注册registerObserver()
*/
public class test {
public static void main(String[] args) {
newsPaperOffice newsPaperOffice = new newsPaperOffice();
//创建3个 观察者
Observer observerA = new personA();
Observer observerB = new personB();
Observer observerC = new personC();
//注册观察者
newsPaperOffice.registerObserver(observerA);
newsPaperOffice.registerObserver(observerB);
newsPaperOffice.registerObserver(observerC);
newsPaperOffice.provide();
//取消一个观察者
newsPaperOffice.removeObserver(observerA);
newsPaperOffice.provide();
}
}
执行结果
AAA 我收到最新新闻
BBB 我收到最新新闻
CCC 我收到最新新闻
BBB 我收到最新新闻
CCC 我收到最新新闻