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☆,有问题欢迎交流,俺会改的✊

相关推荐
云上漫步者5 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——sys_locale完整适配案例
开发语言·后端·rust
guygg885 小时前
基于MATLAB的精密星历内插实现方案
开发语言·matlab
ezreal_pan5 小时前
基于券类型路由的渐进式重构:函数式选项模式与管道模式的完美结合
设计模式·重构·golang·选项函数
专注VB编程开发20年5 小时前
c#语法和java相差多少
java·开发语言·microsoft·c#
cici158745 小时前
MATLAB中实现图像超分辨率
开发语言·matlab
kaikaile19955 小时前
基于 MATLAB 实现 近红外光谱(NIRS)血液定量分析
开发语言·matlab
爱装代码的小瓶子5 小时前
【c++进阶】在c++11之前的编译器的努力
开发语言·c++·vscode·visualstudio·编辑器·vim
蜗牛love天空5 小时前
智能指针的值传递和引用传递
开发语言·c++
☆cwlulu5 小时前
C语言关键字详解
开发语言