观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,用于实现对象间的发布-订阅机制,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
观察者模式中包含以下角色:
- 抽象主题(Subject):定义了被观察者对象的接口,包含了添加、删除和通知观察者的方法。
- 具体主题(ConcreteSubject):实现了抽象主题的接口,保存了观察者列表,并在状态发生变化时通知所有观察者。
- 抽象观察者(Observer):定义了观察者的接口,包含了更新方法。
- 具体观察者(ConcreteObserver):实现了抽象观察者的接口,在被观察者状态发生变化时接收通知并进行更新。
以下是观察者模式的一个简单示例,假设有一个微信公众号类(WeChatAccount),包含了关注、取消关注和发送消息的方法。使用观察者模式,可以让所有关注该公众号的用户(Observer)都能够收到发送的消息。
Subject.java:
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
ConcreteSubject.java:
public class WeChatAccount extends Subject {
private String name;
public WeChatAccount(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void publish(String message) {
System.out.println("公众号:" + name + " 发布了一条消息:" + message);
notifyObservers(message);
}
}
Observer.java:
public interface Observer {
void update(String message);
}
ConcreteObserver.java:
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到一条消息:" + message);
}
}
使用观察者模式:
public class Main {
public static void main(String[] args) {
WeChatAccount weChatAccount = new WeChatAccount("Java之路");
User user1 = new User("张三");
User user2 = new User("李四");
weChatAccount.attach(user1);
weChatAccount.attach(user2);
weChatAccount.publish("Java新特性");
weChatAccount.detach(user2);
weChatAccount.publish("Spring Boot 教程");
}
}
在上述代码中,WeChatAccount 是具体主题,User 是具体观察者。当使用 weChatAccount.publish() 发布一条消息时,所有关注该公众号的用户都可以收到消息。