设计模式——观察者模式17

观察者模式指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。

中介者模式是N对N的双向关系。观察者模式是1对N的单向关系。
设计模式,一定要敲代码理解

发布者抽象(主题)

java 复制代码
/**
 * @author ggbond
 * @date 2024年04月15日 10:04
 */
public  interface Theme {
    // 添加观察者(订阅者)
    public void attach(Subscribe s);
    // 删除观察者(订阅者)
    public void detach(Subscribe s);
    // 通知所有观察者(订阅者)
    public void notifySubscriber();
}

发布者实现

java 复制代码
/**
 * @author ggbond
 * @date 2024年04月15日 10:06
 */
public class Publisher implements Theme{
    private List<Subscribe> list=new ArrayList<>();
    @Override
    public void attach(Subscribe s) {
        list.add(s);

    }

    @Override
    public void detach(Subscribe s) {
        list.remove(s);
    }

    //通知所有订阅者
    @Override
    public void notifySubscriber() {
        System.out.println("@全体人员,今晚有个party,地点在望子成龙小学");
        for (Subscribe o : list) {
            o.getinfo();
        }
    }
}

订阅者抽象

java 复制代码
public interface Subscribe {
    void getinfo();
}

订阅者实现

java 复制代码
/**
 * @author ggbond
 * @date 2024年04月15日 10:11
 */
public class Subscriber implements Subscribe{
    private String name;

    public Subscriber(String name) {

        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void getinfo() {
        System.out.println(name+":收到最新信息");
    }
}

测试与结果

java 复制代码
/**
 * @author ggbond
 * @date 2024年04月15日 10:14
 */
public class Main {
    public static void main(String[] args) {

        //发布者
        Publisher publisher=new Publisher();

        //订阅者
        Subscribe s1=new Subscriber("ggbond1");
        Subscribe s2=new Subscriber("ggbond2");
        Subscribe s3=new Subscriber("ggbond3");

        //订阅者订阅主题
        publisher.attach(s1);
        publisher.attach(s2);
        publisher.attach(s3);

        //通知
        publisher.notifySubscriber();

    }
}
java 复制代码
@全体人员,今晚有个party,地点在望子成龙小学
ggbond1:收到最新信息
ggbond2:收到最新信息
ggbond3:收到最新信息

总结

关系为1对N,对满足开闭原则。 无需修改发布者代码就能引入新的订阅者类

代码下载

代码下载

相关推荐
q***441511 分钟前
Spring Security 新版本配置
java·后端·spring
o***741720 分钟前
Springboot中SLF4J详解
java·spring boot·后端
孤独斗士23 分钟前
maven的pom文件总结
java·开发语言
CoderYanger39 分钟前
递归、搜索与回溯-记忆化搜索:38.最长递增子序列
java·算法·leetcode·1024程序员节
面试鸭44 分钟前
科大讯飞,你好大方。。。
java·计算机·职场和发展·求职招聘
韩立学长1 小时前
【开题答辩实录分享】以《智慧物业管理系统的设计与实现》为例进行答辩实录分享
java·后端·mysql
10km1 小时前
java:json-path支持fastjson作为JSON解析提供者的技术实现
java·json·fastjson·json-path
小张程序人生1 小时前
深入理解SpringSecurity从入门到实战
java
d***95622 小时前
springboot接入deepseek深度求索 java
java·spring boot·后端
CoderYanger2 小时前
C.滑动窗口-越短越合法/求最长/最大——2958. 最多 K 个重复元素的最长子数组
java·数据结构·算法·leetcode·哈希算法·1024程序员节