【设计模式】观察者模式 详解

shadowLogo

概述:

观察者 = 发布者 + 订阅者
订阅者时刻(或 间断)直接(或 简介)监视 发布者 的 动作 和 状态
最终对于 特定的动作 或 特定的状态做出响应


使用展示:

现在,本人来给出一个 被订阅者类

被订阅者 类:

package edu.youzg.design.pattern.observer;

/**
 * @Author: Youzg
 * @CreateTime: 2021-05-10 20:43
 * @Description: 带你深究Java的本质!
 */
public class IdolInfo {
    public String idolName;

    public IdolInfo(String idolName) {
        this.idolName = idolName;
    }

    public String getIdolName() {
        return idolName;
    }
}

本人再来给出一个 粉丝类

订阅者 类:

package edu.youzg.design.pattern.observer;

/**
 * @Author: Youzg
 * @CreateTime: 2021-05-10 20:44
 * @Description: 带你深究Java的本质!
 */
public class FanInfo {
    private int id;

    public FanInfo(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

现在,本人给出一个 注册中心/通知器

发布者 类:

package edu.youzg.design.pattern.observer;

import java.util.ArrayList;

/**
 * @Author: Youzg
 * @CreateTime: 2021-05-10 20:42
 * @Description: 带你深究Java的本质!
 */
public class Registry {

    ArrayList<FanInfo> fans = new ArrayList<>();
    ArrayList<IdolInfo> idols = new ArrayList<>();

    // 添加 粉丝
    public void addFan(FanInfo fan) {
        fans.add(fan);
    }

    // 添加 偶像活动
    public void addIdol(IdolInfo idol) {
        idols.add(idol);
        //通知
        sendNoticeToFan(idol, fans);
    }

    // 发布 偶像活动
    private void sendNoticeToFan(IdolInfo idol, ArrayList<FanInfo> fans) {
        for (FanInfo fan : fans) {
            System.out.println(fan.getId() + "号粉丝,您好,偶像" + idol.getIdolName() + "今晚有演唱会,望准时参加!");
        }

    }

}

现在,本人再来给出一个 测试类

测试类:

package edu.youzg.design.pattern.observer;

/**
 * @Author: Youzg
 * @CreateTime: 2021-05-10 20:39
 * @Description: 带你深究Java的本质!
 */
public class YouzgTest {

    public static void main(String[] args) {
        FanInfo fan1 = new FanInfo(12580);
        FanInfo fan2 = new FanInfo(8080);
        FanInfo fan3 = new FanInfo(6666);
        FanInfo fan4 = new FanInfo(9000);

        Registry registry = new Registry();
        registry.addFan(fan1);
        registry.addFan(fan2);
        registry.addFan(fan3);
        registry.addFan(fan4);

        registry.addIdol(new IdolInfo("Youzg"));
    }

}

现在,本人展示下 运行结果

运行结果:

结果


观察者模式 与 发布订阅模式:

我们在 23种设计模式 中,可以发现是没有 发布-订阅模式 的,而且也没有 生产者-消费者模式

这是因为:

我们可以把 23种设计模式 理解为 初始设计模式
其它各种模式,都是由着 23种设计模式 组合 或 衍生 而 诞生的设计模式
而且 23种设计模式 本身又存在着 组合 或 衍生 的关系

就像我们实现一个功能,可以选择不同的架构模式一样,
实现一种设计模式的概念,我们也可以 通过不通的实现手段
因此,我们可以理解为:

23种设计模式 只是 最基本的设计模式

(其实本人在最近有所悟,23种设计模式 大多数本质上就是 花式玩接口,以及 6大设计原则花式实现

而 无论是在 分布式架构,还是在 许多 中间件设计 中,发布-订阅模式,都十分重要!


那么,至此,观察者模式 就讲解完毕了!

posted @ 2021-05-10 21:01  在下右转,有何贵干  阅读(76)  评论(0)    收藏  举报