? 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,会通知所有依赖它的观察者对象,使它们都能够得到通知并且被自动更新
? 在我们生活中,用户可以在音乐播放平台关注多个歌手,而当有歌手发布新的歌曲时,可以将歌曲发布到音乐播放平台,而平台会将新的歌曲详细信息发送给关注该歌手的用户。而此时歌手就相当于是观察者模式的主题对象,每个关注的用户则是观察者模式中的观察者对象,通过该模式,用户可以很及时的听到歌手的新歌曲,而歌手也可以很轻松的通知用户新歌曲的发布。
package com.technologystatck.designpattern.mode.observer;
import java.util.ArrayList;
import java.util.List;
public class Observers {
public static void main(String[] args) {
//创建具体主题对象
ConcreteSubject concreteSubject = new ConcreteSubject();
//创建具体观察者对象
Observer concreteObserverA = new ConcreteObserver();
Observer concreteObserverB = new ConcreteObserver();
//注册观察者
concreteSubject.registerObserver(concreteObserverA);
concreteSubject.registerObserver(concreteObserverB);
//调用主题方法
concreteSubject.setState("有新的观察者注册");
}
}
//主题接口(主题)
interface Subject{
//注册观察者
void registerObserver(Observer observer);
//移除观察者
void removeObserver(Observer observer);
//通知观察者
void notifyObserver();
}
//观察者接口(观察者)
interface Observer{
//更新方法
void update(String message);
}
//具体主题实现
class ConcreteSubject implements Subject{
//观察者列表
private List<Observer> observers = new ArrayList<>();
//状态
private String state;
//注册观察者方法(注册)
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
//移除观察者方法(移除)
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
//通知观察者方法(通知)
//遍历观察者列表,并通知每个观察者更新状态
@Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.update(state);
}
}
//更新状态
public void setState(String state) {
this.state = state;
notifyObserver();
}
}
//具体观察者实现
class ConcreteObserver implements Observer{
//更新方法
@Override
public void update(String message) {
System.out.println(message);
}
}
小明所在的学校有一个时钟(主题),每到整点时,它就会通知所有的学生(观察者)当前的时间,请你使用观察者模式实现这个时钟通知系统。
注意点:时间从 0 开始,并每隔一个小时更新一次。
输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示学生的数量。
接下来的 N 行,每行包含一个字符串,表示学生的姓名。
最后一行是一个整数,表示时钟更新的次数。
对于每一次时钟更新,输出每个学生的姓名和当前的时间。
package com.technologystatck.designpattern.mode.observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取学?数量
int N = scanner.nextInt();
// 创建时钟
Clock clock = new Clock();
// 注册学?观察者
for (int i = 0; i < N; i++) {
String studentName = scanner.next();
clock.registerObserver(new Student(studentName));
}
// 读取时钟更新次数
int updates = scanner.nextInt();
// 模拟时钟每隔?个?时更新?次
for (int i = 0; i < updates; i++) {
clock.tick();
}
}
}
// 观察者接?
interface Observer {
void update(int hour);
}
// 主题接?
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体主题实现
class Clock implements Subject {
private List<Observer> observers = new ArrayList<>();
private int hour = 0;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(hour);
}
}
public void tick() {
hour = (hour + 1) % 24; // 模拟时间的推移
notifyObservers();
}
}
// 具体观察者实现
class Student implements Observer {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void update(int hour) {
System.out.println(name + " " + hour);
}
}