观察者设计模式
观察者设计模式(Observer Design Pattern)是一种常用的软件设计模式,它是一种行为型模式。该模式用于定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
结构
观察者模式通常涉及以下几个角色:
Subject(主题):主题是被观察的对象,它包含了需要被观察的状态。当主题状态发生变化时,它会通知所有的观察者对象。
Observer(观察者):观察者是依赖于主题的对象,它们将在主题状态发生变化时得到通知,并进行相应的更新操作。
ConcreteSubject(具体主题):具体主题是主题的具体实现,它维护了一组观察者对象,并在状态发生改变时通知它们。
ConcreteObserver(具体观察者):具体观察者实现了观察者接口,在收到主题通知时执行特定的更新操作。
示例
以下是一个简单的观察者模式的示例,假设我们有一个主题(Subject)代表气象站,而观察者(Observer)是一组天气显示板,它们会在气象站更新数据时自动更新显示:
import java.util.ArrayList; import java.util.List; // 主题接口 interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 观察者接口 interface Observer { void update(float temperature, float humidity, float pressure); } // 具体主题 class WeatherData implements Subject { private List<Observer> observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList<>(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(temperature, humidity, pressure); } } public void measurementsChanged() { notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } } // 具体观察者 class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; display(); } public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } } // 测试 public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(); weatherData.registerObserver(currentDisplay); weatherData.setMeasurements(80, 65, 30.4f); } }
发布订阅者模式
发布-订阅者模式(Publish-Subscribe Pattern)是一种软件设计模式,用于实现消息的发布和订阅机制,也被称为观察者模式的变体。在发布-订阅者模式中,消息的发布者(发布者)和消息的接收者(订阅者)之间没有直接的依赖关系,它们通过一个称为"消息代理"或"事件总线"的中介来进行通信。这种模式允许组件之间松耦合地通信,从而提高系统的可扩展性和灵活性。
结构
发布-订阅者模式通常包括以下几个关键部分:
发布者(Publisher):负责发布消息或事件到消息代理。
订阅者(Subscriber):注册对特定类型的消息或事件感兴趣,并在消息到达时执行相应的操作。
消息代理(Message Broker):作为发布者和订阅者之间的中介,负责管理消息的路由和传递。它维护了发布者和订阅者之间的关系,并在消息到达时将消息传递给所有订阅者。
示例
以下是一个简单的发布-订阅者模式的示例,假设我们有一个新闻发布系统,包括新闻发布者和新闻订阅者:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // 消息代理 class MessageBroker { private Map<String, List<Subscriber>> topics = new HashMap<>(); public void subscribe(String topic, Subscriber subscriber) { topics.computeIfAbsent(topic, k -> new ArrayList<>()).add(subscriber); } public void publish(String topic, String message) { List<Subscriber> subscribers = topics.get(topic); if (subscribers != null) { for (Subscriber subscriber : subscribers) { subscriber.receive(message); } } } } // 订阅者接口 interface Subscriber { void receive(String message); } // 新闻订阅者 class NewsSubscriber implements Subscriber { private String name; public NewsSubscriber(String name) { this.name = name; } public void receive(String message) { System.out.println(name + " received news: " + message); } } // 新闻发布者 class NewsPublisher { private MessageBroker messageBroker; public NewsPublisher(MessageBroker messageBroker) { this.messageBroker = messageBroker; } public void publishNews(String topic, String news) { messageBroker.publish(topic, news); } } // 测试 public class NewsSystem { public static void main(String[] args) { MessageBroker messageBroker = new MessageBroker(); NewsPublisher publisher = new NewsPublisher(messageBroker); publisher.publishNews("sports", "New record set in 100m sprint!"); publisher.publishNews("technology", "New smartphone announced!"); NewsSubscriber subscriber1 = new NewsSubscriber("John"); NewsSubscriber subscriber2 = new NewsSubscriber("Alice"); messageBroker.subscribe("sports", subscriber1); messageBroker.subscribe("technology", subscriber2); publisher.publishNews("sports", "Team wins championship!"); } }
发布-订阅者模式在事件驱动的系统中非常有用,它可以使系统中的各个组件彼此解耦,并提供一种灵活的通信机制。
观察者vs发布订阅