行为型模式 - 观察者模式 (Publish/Subscribe)
又称作为订阅发布模式(Publish-Subscribe Pattern)是一种消息传递模式,在该模式中,发送者(发布者)不会直接将消息发送给特定的接收者(订阅者),而是将消息发布到一个中间的消息代理(如主题或频道),订阅了该主题的订阅者可以接收到这些消息。以下是几个订阅发布模式的经典案例。
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<>();@Overridepublic void registerObserver(Observer observer, String newsType) {observers.computeIfAbsent(newsType, k -> new ArrayList<>()).add(observer);}@Overridepublic void removeObserver(Observer observer, String newsType) {List<Observer> observerList = observers.get(newsType);if (observerList != null) {observerList.remove(observer);}}@Overridepublic 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;}@Overridepublic 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("财经", "股市行情上涨");}
}