行为型模式 - 观察者模式 (Publish/Subscribe)
订阅发布模式(Publish-Subscribe Pattern)是一种消息传递模式,在该模式中,发送者(发布者)不会直接将消息发送给特定的接收者(订阅者),而是将消息发布到一个中间的消息代理(如主题或频道),订阅了该主题的订阅者可以接收到这些消息。以下是几个订阅发布模式的经典案例。
java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// 主题接口
interface Subject {
void registerObserver(Observer observer, String newsType);
void removeObserver(Observer observer, String newsType);
void notifyObservers(String newsType, String news);
}
// 观察者接口
interface Observer {
void update(String news);
}
// 新闻机构类,实现主题接口
class NewsAgency implements Subject {
private Map<String, List<Observer>> observers = new HashMap<>();
@Override
public void registerObserver(Observer observer, String newsType) {
observers.computeIfAbsent(newsType, k -> new ArrayList<>()).add(observer);
}
@Override
public void removeObserver(Observer observer, String newsType) {
List<Observer> observerList = observers.get(newsType);
if (observerList != null) {
observerList.remove(observer);
}
}
@Override
public void notifyObservers(String newsType, String news) {
List<Observer> observerList = observers.get(newsType);
if (observerList != null) {
for (Observer observer : observerList) {
observer.update(news);
}
}
}
public void publishNews(String newsType, String news) {
System.out.println("发布 " + newsType + " 新闻: " + news);
notifyObservers(newsType, news);
}
}
// 用户类,实现观察者接口
class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String news) {
System.out.println(name + " 收到新闻: " + news);
}
}
// 客户端代码
public class NewsSystem {
public static void main(String[] args) {
NewsAgency newsAgency = new NewsAgency();
User user1 = new User("张三");
User user2 = new User("李四");
// 用户订阅体育新闻
newsAgency.registerObserver(user1, "体育");
newsAgency.registerObserver(user2, "体育");
// 用户订阅财经新闻
newsAgency.registerObserver(user1, "财经");
// 发布体育新闻
newsAgency.publishNews("体育", "篮球比赛结果公布");
// 发布财经新闻
newsAgency.publishNews("财经", "股市行情上涨");
}
}