目录
一,看图初步理解

如果是刚开始接触到设计模式的朋友,可能会疑惑
观察者是个什么意思(・∀・(・∀・(・∀・*),要观察什么
举个例子:
有一本非常著名的杂志,有很多忠实的读者都等着它的更新
这里的读者我们就说他们是观察者(ConcreteObserver)
杂志的更新对读者们来说尤其重要,需要有人能够及时通知他们杂志的情况
所以我们需要一个工具,能够协助杂志社进行通知读者的工作
这里我们就引入了具体目标(ConcreteSubject)
它的作用如下
1.统计读者数量与信息,便于后续通知到他们
2.更新后通知读者
为了方便管理,这里还引入了
**Observer接口:**方便实现对所有读者的统一管理
**Subject抽象类:**实现对通知行为的统一管理
通过这种方式,就实现了针对观察者通知的完整流程
接下来通过一个题目加深大家的理解
二,题目
如下代码 Subject 和 Observer 分别是观察者设计模式中的主题接口和观察者接口,
GameScore实现主题接口,记录篮球比赛的比分,其中gameTime数据域表示比赛进行的时间,
homeScore数据域表示主队得分,visitorScore数据域表示客队得分。
ScoreDB是其中一个观察者,将得分情况记录进入数据库
VoiceScore是其中一个观察者,语音播报得分
DisplayScore 是其中一个观察者,大屏显示得分
请将 GameScore 类补充完整并提交(只需提交GameScore 类)
javaimport 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 类并提交**/
javaclass 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☆,有问题欢迎交流,俺会改的✊