观察者模式(发布-订阅模式)

用途:可用于拦截过滤器

消息推送接口:

java 复制代码
public interface Subject {
    //添加订阅者
    void addObserver(Observer observer);
    //移除订阅者
    void removeObserver(Observer observer);
    //通知订阅者
    void notifyObservers(String message);
}

消息推送实现着:

java 复制代码
​
public class ConcreteSubject implements Subject{

    //订阅者集合
    ArrayList<Observer> observers = new ArrayList<>();


    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

​

订阅者接口

java 复制代码
public interface Observer {
    void update(String message);

}

订阅者1

java 复制代码
public class ObserverOne implements Observer{
    @Override
    public void update(String message) {
        System.out.println("ObserverOne"+message);
    }
}

订阅者2

java 复制代码
public class ObserverTwo implements Observer{
    @Override
    public void update(String message) {
        System.out.println("ObserverTwo"+message);
    }
}

测试:

java 复制代码
public class Tes {
    public static void main(String[] args) {
        ConcreteSubject concreteSubject = new ConcreteSubject();
        concreteSubject.addObserver(new ObserverOne());
        concreteSubject.addObserver(new ObserverTwo());
        concreteSubject.notifyObservers("hello world");
    }
}
相关推荐
m0_748233644 分钟前
【类与对象(中)】C++类默认成员函数全解析
开发语言·c++·算法
郝学胜-神的一滴10 分钟前
使用 Python 元类与属性实现惰性加载:Effective Python 第47条
linux·服务器·开发语言·python
Han.miracle10 分钟前
数据库圣经-----最终章JDBC
java·数据库·学习·maven·database
艾菜籽1 小时前
MyBatis操作数据库入门
java·数据库·mybatis
zfoo-framework1 小时前
使用VisualVM进行java性能瓶颈定位 1.无需像JProfiler那样必须加启动参数???
java
散峰而望1 小时前
基本魔法语言分支和循环 (二) (C语言)
c语言·开发语言·github·visual studio
bug攻城狮1 小时前
Spring Boot 2.6+ 整合 PageHelper 启动报错:循环依赖解决方案全解析
java·spring boot·后端
前端世界1 小时前
用Python手写一个能识花的感知器模型——Iris分类实战详解
开发语言·python·分类
心.c1 小时前
深拷贝浅拷贝
开发语言·前端·javascript·ecmascript
曦樂~1 小时前
【Qt】启动新窗口--C/S传输信息
开发语言·qt