马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
观察者模式简介
观察者模式(Observer Pattern)是一种活动筹划模式,它界说了对象间的一种一对多的依赖关系,当一个对象状态发生改变时,全部依赖于它的对象都会得到关照并主动更新。这种模式也被称为发布-订阅模式、模子-视图模式、源-监听器模式、附属者模式等。
观察者模式的优缺点
长处
- 低落耦合度:观察者模式将主题和观察者分离,主题不须要知道观察者的详细细节,从而低落了它们之间的耦合度。
- 支持广播通讯:主题状态厘革时,可以关照多个观察者,实现了一对多的通讯,方便信息广播。
- 开闭原则:通过增长新的观察者类和主题类,可以扩展观察者模式,符合开闭原则。
- 可维护性:由于观察者和主题之间的关系是疏松的,以是更容易维护和修改。
缺点
- 性能题目:假如观察者太多,关照全部观察者大概会影响性能,尤其是在大规模体系中。
- 次序题目:观察者的关照次序大概不确定,假如有次序要求,须要额外处理惩罚。
- 大概导致循环依赖:主题和观察者之间的循环依赖大概引入题目,须要鉴戒处理惩罚。
实战业务场景
场景一:股票市场监控
假设我们须要开辟一个股票市场监控 体系,当股票代价发生厘革时,体系须要关照全部注册的投资者。这里可以使用观察者模式,将股票市场作为主题,投资者作为观察者。- [/code]java
- [code]
- public interface Observer {
- void update(double price);
- }
- public interface Subject {
- void registerObserver(Observer observer);
- void removeObserver(Observer observer);
- void notifyObservers();
- }
- public class StockMarket implements Subject {
- private List<Observer> observers = new ArrayList<>();
- private double price;
- @Override
- public void registerObserver(Observer observer) {
- observers.add(observer);
- }
- @Override
- public void removeObserver(Observer observer) {
- observers.remove(observer);
- }
- @Override
- public void notifyObservers() {
- for (Observer observer : observers) {
- observer.update(price);
- }
- }
- public void setPrice(double price) {
- this.price = price;
- notifyObservers();
- }
- }
- public class Investor implements Observer {
- private String name;
- public Investor(String name) {
- this.name = name;
- }
- @Override
- public void update(double price) {
- System.out.println(name + " 收到股票价格更新,当前价格为 " + price);
- }
- }
复制代码 场景二:天气信息更新
另一个场景是天气信息更新体系,当天气数据(如温度、湿度、压力)发生厘革时,须要更新全部注册的表现装备。这里,天气数据作为主题,表现装备作为观察者。- [/code]java
- [code]
- public class WeatherData {
- private List<Observer> observers;
- private float temperature;
- private float humidity;
- private float pressure;
- public WeatherData() {
- observers = new ArrayList<>();
- }
- public void registerObserver(Observer o) {
- observers.add(o);
- }
- public void removeObserver(Observer o) {
- observers.remove(o);
- }
- 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();
- }
- }
- public class DisplayElement implements Observer {
- private float temperature;
- private float humidity;
- private float pressure;
- @Override
- public void update(float temperature, float humidity, float pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- this.pressure = pressure;
- display();
- }
- public void display() {
- System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity and " + pressure + " mm pressure");
- }
- }
复制代码 总结
观察者模式在许多场景下都非常有用,特殊是在须要实现对象间松耦合通讯的情况下。但在使用时须要注意性能题目、循环依赖和实行次序等方面的思量。通过上述实战业务场景,我们可以看到观察者模式怎样在实际项目中应用,以及怎样通过Spring Boot的事故驱动机制来实现观察者模式,进步体系的机动性和可维护性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |