Java设计模式之观察者模式(发布-订阅模式)
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整洁之道》《数据库》    }
 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号