Java设计模式超详解--观察者设计模式

目录

一,看图初步理解

二,题目

题目分析:

三,总结


一,看图初步理解

如果是刚开始接触到设计模式的朋友,可能会疑惑

观察者是个什么意思(・∀・(・∀・(・∀・*),要观察什么

举个例子:

有一本非常著名的杂志,有很多忠实的读者都等着它的更新

这里的读者我们就说他们是观察者(ConcreteObserver)

杂志的更新对读者们来说尤其重要,需要有人能够及时通知他们杂志的情况

所以我们需要一个工具,能够协助杂志社进行通知读者的工作

这里我们就引入了具体目标(ConcreteSubject)

它的作用如下

1.统计读者数量与信息,便于后续通知到他们

2.更新后通知读者

为了方便管理,这里还引入了

**Observer接口:**方便实现对所有读者的统一管理

**Subject抽象类:**实现对通知行为的统一管理

通过这种方式,就实现了针对观察者通知的完整流程

接下来通过一个题目加深大家的理解

二,题目

如下代码 Subject 和 Observer 分别是观察者设计模式中的主题接口和观察者接口,

GameScore实现主题接口,记录篮球比赛的比分,其中gameTime数据域表示比赛进行的时间,

homeScore数据域表示主队得分,visitorScore数据域表示客队得分。

ScoreDB是其中一个观察者,将得分情况记录进入数据库

VoiceScore是其中一个观察者,语音播报得分

DisplayScore 是其中一个观察者,大屏显示得分

请将 GameScore 类补充完整并提交(只需提交GameScore 类)

java 复制代码
import java.util.*;



interface Subject {

    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyObserver();

}



interface Observer {

    public void update(String gameTime,int homeScore,int visitorScore);

}

/**补充完整GameScore 类并提交**/

java 复制代码
class ScoreDB implements  Observer{



    @Override

    public void update(String gameTime, int homeScore, int visitorScore) {

        System.out.println(String.format("%s:%d-%dwriteToDB",gameTime,homeScore,visitorScore));

    }

}

class VoiceScore implements  Observer{

    @Override

    public void update(String gameTime, int homeScore, int visitorScore) {

        System.out.println(String.format("%s:%d-%dvoice",gameTime,homeScore,visitorScore));

    }

}

class DisplayScore implements  Observer{

    @Override

    public void update(String gameTime, int homeScore, int visitorScore) {

        System.out.println(String.format("%s:%d-%dscreenDisplay",gameTime,homeScore,visitorScore));

    }

}

public class Main {

    public static void main(String[] args){

        GameScore gameScore=new GameScore();

        ScoreDB scoreDB=new ScoreDB();

        VoiceScore voiceScore=new VoiceScore();

        DisplayScore displayScore=new DisplayScore();

        gameScore.registerObserver(scoreDB);

        gameScore.registerObserver(voiceScore);

        gameScore.registerObserver(displayScore);

        gameScore.setScore("Game10minute",1,0);

        gameScore.removeObserver(voiceScore);

        gameScore.setScore("Game19minute",1,1);

    }



}

输出描述

Game10minute:1-0writeToDB

Game10minute:1-0voice

Game10minute:1-0screenDisplay

Game19minute:1-1writeToDB

Game19minute:1-1screenDisplay

题目分析:

根据题目已经给出的代码以及题目要求,我们来理一下该题目的逻辑

**观察者(ConcreteObserver)**是谁

ScoreDB是其中一个观察者,将得分情况记录进入数据库

VoiceScore是其中一个观察者,语音播报得分

DisplayScore 是其中一个观察者,大屏显示得分

题目已经明确告诉我们

现在让我们分析一下观察者的代码

java 复制代码
class ScoreDB implements  Observer{



    @Override

    public void update(String gameTime, int homeScore, int visitorScore) {

        System.out.println(String.format("%s:%d-%dwriteToDB",gameTime,homeScore,visitorScore));

    }

}

只有一个函数,等待具体目标(ConcreteSubject)将更新后的内容传输给他得到结果

那谁又是**具体目标(ConcreteSubject)**呢

我们发现题目中已经给出的类分别对应**观察者(ConcreteObserver)/****Observer接口/**Subject接口

因此需要我们补充的GameScore 类 显而易见就是我们需要的具体目标(ConcreteSubject)

画出类图

因此GameScore 类需要实现2部分工作

1.增加观察者

2.通知观察者使之更新

再结合题目已经给出的Subject接口

我们实现代码如下

java 复制代码
class GameScore implements Subject{
    
    private List<Observer> Observers = new ArrayList<>(); 

    private String gameTime;//比赛进行时间

    private int homeScore;//主队得分

    private int visitorScore;//客队得分



    public void setScore(String gameTime,int homeScore,int visitorScore){

        this.gameTime=gameTime;

        this.homeScore=homeScore;

        this.visitorScore=visitorScore;

        notifyObserver();

    }

  public void registerObserver(Observer o){//增加观察者
      Observers.add(o);
  }

    public void removeObserver(Observer o){//移除观察者
        Observers.remove(o);
    }

    public void notifyObserver(){//挨个通知观察者
        for(Observer o:Observers){
            o.update(this.gameTime, this.homeScore, this.visitorScore);
        }
    }

}

三,总结

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

设计模式系列持续更新,欢迎关注博主~

希望对大家有用,祝您开心~(o゜▽゜)o☆,有问题欢迎交流,俺会改的✊

相关推荐
阿里嘎多学长2 分钟前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
abcnull1 小时前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡2 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan2 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054732 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路2 小时前
C++23概述
java·c++·c++23
时空系2 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
专注API从业者3 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
CHANG_THE_WORLD4 小时前
python 批量终止进程exe
开发语言·python