观察者模式其实就是一个通知系统,比如说你订阅了一个YouTube频道,当这个频道上传新视频时,你就会收到通知。这个模式就像你是观察者,YouTube频道是被观察者,当频道有新内容时,它会通知你,你就会去看新内容。
1.组成部分
- 被观察者(YouTube频道)
- 有很多观众关注它
- 当它发布新视频时,需要通知所有的观众
- 观察者(观众)
- 订阅了多个频道(被观察者)
- 当某个频道发布新视频,会受到通知
2.实现方式
- 被观察者(YouTube频道)需要有一个观众列表:
- 这个列表保存了所有订阅这个频道的观众。
- 当有新视频发布时,频道会遍历这个列表,通知每一个观众。
- 观众(观察者)订阅频道(被观察者):
- 当观众想订阅一个频道时,会将自己添加到频道的观众列表里。
- 当观众不想再订阅这个频道时,可以将自己从频道的观众列表里移除。
3.JAVA示例
定义观察者接口(观众)
public interface Observer {
void update(String videoTitle);
}
定义被观察者类(YouTube频道)
import java.util.ArrayList;
import java.util.List;
public class YouTubeChannel {
private List<Observer> observers = new ArrayList<>();
private String channelName;
public YouTubeChannel(String channelName) {
this.channelName = channelName;
}
public void subscribe(Observer observer) {
observers.add(observer);
}
public void unsubscribe(Observer observer) {
observers.remove(observer);
}
public void uploadVideo(String videoTitle) {
System.out.println("Channel " + channelName + " uploaded a new video: " + videoTitle);
notifyObservers(videoTitle);
}
private void notifyObservers(String videoTitle) {
for (Observer observer : observers) {
observer.update(videoTitle);
}
}
}
实现具体的观察者(观众)
public class Subscriber implements Observer {
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(String videoTitle) {
System.out.println("Hey " + name + ", new video uploaded: " + videoTitle);
}
}
测试
public class ObserverPatternTest {
public static void main(String[] args) {
YouTubeChannel techChannel = new YouTubeChannel("TechChannel");
Observer subscriber1 = new Subscriber("Alice");
Observer subscriber2 = new Subscriber("Bob");
techChannel.subscribe(subscriber1);
techChannel.subscribe(subscriber2);
techChannel.uploadVideo("Design Patterns in Java");
}
}
结果
当TechChannel
上传新视频时,所有订阅了这个频道的观众(Alice
和Bob
)都会收到通知,并且打印出类似这样的信息:
Channel TechChannel uploaded a new video: Design Patterns in Java
Hey Alice, new video uploaded: Design Patterns in Java
Hey Bob, new video uploaded: Design Patterns in Java