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

相关推荐
橘子hhh3 分钟前
Netty基础服务器实现
java·nio
咬_咬3 分钟前
go语言学习(数组与切片)
开发语言·学习·golang·数组·切片
小陈工5 分钟前
Python Web开发入门(十八):跨域问题解决方案——从“为什么我的请求被拦了“到“我让浏览器乖乖听话“
开发语言·python·机器学习·架构·数据挖掘·回归·状态模式
墨雪遗痕5 分钟前
工程架构认知(二):从 CDN 到 Keep-Alive,理解流量如何被“消化”在系统之外
java·spring·架构
m0_497214156 分钟前
Qt事件系统
开发语言·qt
AI科技星6 分钟前
全维度相对论推导、光速螺旋时空与北斗 GEO 钟差的统一理论
开发语言·线性代数·算法·机器学习·数学建模
赵优秀一一10 分钟前
Python 工程化基础1:环境(conda)、pip、requirements.txt
linux·开发语言·python
用户66885998476620 分钟前
Sprint Boot登录案例
java
li16709027021 分钟前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
游乐码24 分钟前
C#List
开发语言·c#·list