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整洁之道》《数据库》    }

 

猜你喜欢

转载自www.cnblogs.com/yanglanwan/p/11333258.html