目录
又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
在观察者模式中有如下角色:
实现抖音中类似博主发布作品后会将作品推送给粉丝的案例,重点在于理解设计模式
- //抽象主题角色
- public interface Subject {
- //添加订阅者
- void attach(Observer observer);
- //删除订阅者
- void delete(Observer observer);
- //更新消息
- void notify(String msg);
- }
创建抽象观察者
- public interface Observer {
- void update(String msg);
- }
创建具体主题类
- public class SubscriptionSubject implements Subject{
- private List
wxUser = new ArrayList<>(); -
- @Override
- public void attach(Observer observer) {
- wxUser.add(observer);
- }
-
- @Override
- public void delete(Observer observer) {
- wxUser.remove(observer);
- }
-
- @Override
- public void notify(String msg) {
- for (Observer observer : wxUser) {
- observer.update(msg);
- }
- }
- }
创建具体观察类
- public class wxUser implements Observer{
- private String name;
-
- public wxUser(String name) {
- this.name = name;
- }
-
- @Override
- public void update(String msg) {
- System.out.println(name+"更新了"+msg);
- }
- }
测试
- public class Client {
- public static void main(String[] args) {
- SubscriptionSubject subscriptionSubject = new SubscriptionSubject();
- subscriptionSubject.attach(new wxUser("小明"));
- subscriptionSubject.attach(new wxUser("小王"));
- subscriptionSubject.attach(new wxUser("小张"));
-
- subscriptionSubject.notify("《我头发没了》");
- }
- }
小明更新了《我头发没了》
小王更新了《我头发没了》
小张更新了《我头发没了》
在 Java 中,通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例。
在ObServable类中定义了一个Vector类型的集合用来记录观察者。在创建出ObServable对象时对其初始化。
在addObServer方法中,先进行判断是否包含了观察者对象,其次在进行添加集合。
在进行更新操作时,先将集合转为数组,通过倒序的for循环来执行观察者的更新方法。这也就导致了后加入的观察者越早更新。
初始的changed为false,当信息发生改变要通知观察者时,要调用setChanged()方法修改changed状态后才可以通知观察者,而在转化为数组后调用clearChanged()方法将内部状态属性changed改为true。
在使用ObServer与ObServable时,将观察者实现ObServer接口,被观察者实现ObServable接口。