IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式(二):观察者模式 -> 正文阅读

[Java知识库]设计模式(二):观察者模式

定义:

对象之间存在一对一或者一对多依赖,当一个对象改变状态,依赖它的对象会受到通知并自动更新。例如:MQ(消息队列Message Queue)就是一种观察者模式,发布者发布消息,所有订阅者都能获取到信息。


优点

1.观察者和被观察者式抽象耦合的。
2.建立了一套触发机制。


缺点

1.如果一个被观察者对象有很多直接/间接的观察者,所有的观察者都通知会花费很多时间。
2.如果在观察者和观察目标存在循环依赖,观察目标会触发循环调用,严重可导致系统崩溃。

二、使用案例

1.场景

小编每天上班午休之后,下午工作铃声想起之前都会回想一下今天上午做了什么事情,方便计划下午需要工作那一块内容,上午一般由3部分组成:
1.上班时间到,开始工作
2.午饭时间到,开始吃午饭
3.午休时间到,开始午休
每次下午睡醒觉都会想到这三个方面,我们将该案例应用到观察者模式,早上工作、吃午饭和睡午觉都是由下午工作铃想起后触发回想事件,下面用代码实现:

定义工作事件workInfo

public class WorkInfo{
    public void message() {
        System.out.println("开始工作");
    }
}

定义吃午饭事件EatInfo

public class EatInfo{
    public void message() {
        System.out.println("到饭点,该吃饭了...");
    }
}

定义午休事件SleepInfo

public class SleepInfo{
    public void message(){
        System.out.println("午休时间到,该睡觉了...");
    }
}

根据观察者模式思想,这里我将【开始工作】、【吃午饭】和【睡午觉】作为需要被通知的对象(待回想的事件),由下午工作铃声想起触发,每次闹铃想起都会回想这三件事:

定义下午铃声类Clock和待回想的对象(需要通知的对象)

public abstract class AbstactInfo {
    //被监听的对象
    private Clock clock;

    public abstract void message();
}
public class Clock {
    //一对多,需要接到通知的对象
    private List<AbstactInfo> infoList = new ArrayList<>();

    public void said(){
        System.out.println("下午铃声响了,开始回想上午做到哪了...");
        //通知
        update();
    }

    //通知
    private void update(){
        for (AbstactInfo info : infoList){
            info.message();
        }
    }

    //添加需要通知的对象
    public void addInfo(AbstactInfo info){
        infoList.add(info);
    }
}

待通知事件都继承抽象类AbstactInfo

public class WorkInfo extends AbstactInfo{
    @Override
    public void message() {
        System.out.println("开始工作");
    }
}

public class EatInfo extends AbstactInfo{
    @Override
    public void message() {
        System.out.println("到饭点,该吃饭了...");
    }
}

public class SleepInfo extends AbstactInfo{
    @Override
    public void message(){
        System.out.println("午休时间到,该睡觉了...");
    }
}

2.运行结果

public class MainTest {
    public static void main(String[] args) {
        Clock clock = new Clock();

        WorkInfo workInfo = new WorkInfo();
        clock.addInfo(workInfo);

        EatInfo eatInfo = new EatInfo();
        clock.addInfo(eatInfo);

        SleepInfo sleepInfo = new SleepInfo();
        clock.addInfo(sleepInfo);

        clock.said();
    }
}

在这里插入图片描述


总结

观察者模式一旦观察者发生改变,会通知相关的被观察对象进行改变,类似微信订阅公众号,公众号推送新的推文给所有订阅者。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:27:55  更:2022-02-01 20:29:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:53:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码