实用指南:Java设计模式超详解--观察者设计模式

目录

一,看图初步理解

二,题目

题目分析:

三,总结


一,看图初步理解

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

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

举个例子:

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

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

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

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

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

它的作用如下
1.统计读者数量与信息,便于后续通知到他们

2.更新后通知读者

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

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

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

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

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

二,题目

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

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

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

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

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

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

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

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 类并提交**/

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 是其中一个观察者,大屏显示得分
题目已经明确告诉我们

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

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接口

我们实现代码如下

class GameScore implements Subject{
    private List 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☆,有问题欢迎交流,俺会改的✊

posted @ 2026-01-15 14:14  gccbuaa  阅读(0)  评论(0)    收藏  举报