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

相关推荐
遇见~未来8 分钟前
JavaScript构造函数与Class终极指南
开发语言·javascript·原型模式
foundbug99919 分钟前
基于MATLAB的TDMP-LDPC译码器模型构建、仿真验证及定点实现
开发语言·matlab
X***078833 分钟前
从语言演进到工程实践全面解析C++在现代软件开发中的设计思想性能优势与长期生命力
java·开发语言
smileNicky39 分钟前
SpringBoot系列之集成Pulsar教程
java·spring boot·后端
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Python的车辆管理系统为例,包含答辩的问题和答案
开发语言·python
Sammyyyyy1 小时前
Rust 1.92.0 发布:Never Type 进一步稳定
java·算法·rust
CCPC不拿奖不改名1 小时前
数据处理与分析:数据可视化的面试习题
开发语言·python·信息可视化·面试·职场和发展
alonewolf_991 小时前
深入解析G1与ZGC垃圾收集器:原理、调优与选型指南
java·jvm·算法
液态不合群1 小时前
线程池和高并发
开发语言·python
小镇学者1 小时前
【c++】C++字符串删除末尾字符的三种实现方法
java·开发语言·c++