当前位置: 首页 > wzjs >正文

宝安企业网站建设西安发布最新通知

宝安企业网站建设,西安发布最新通知,盘锦威旺做网站建设公司,网上商城网站建设报价观察者模式详解 一、观察者模式概述 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。 核心特点 松耦合:主题和…

观察者模式详解

一、观察者模式概述

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。

核心特点

  • 松耦合:主题和观察者之间松耦合
  • 自动通知:状态变化时自动通知观察者
  • 一对多:一个主题可对应多个观察者
  • 动态订阅:可动态添加/删除观察者

二、观察者模式的结构

主要角色

  1. Subject:主题/被观察者,维护观察者列表
  2. Observer:观察者接口,定义更新方法
  3. ConcreteSubject:具体主题,状态变化时通知观察者
  4. ConcreteObserver:具体观察者,实现更新逻辑

三、观察者模式的实现

1. 基本实现(推模型)

// 观察者接口
public interface Observer {void update(String message);
}// 主题接口
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 具体主题 - 新闻发布中心
public class NewsAgency implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void setNews(String news) {this.news = news;notifyObservers();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {observers.remove(o);}public void notifyObservers() {for (Observer o : observers) {o.update(news);}}
}// 具体观察者 - 新闻频道
public class NewsChannel implements Observer {private String name;public NewsChannel(String name) {this.name = name;}public void update(String news) {System.out.println(name + " 收到新闻: " + news);}
}// 使用示例
NewsAgency agency = new NewsAgency();
Observer channel1 = new NewsChannel("央视新闻");
Observer channel2 = new NewsChannel("BBC");agency.registerObserver(channel1);
agency.registerObserver(channel2);agency.setNews("重大新闻:Java 21发布!");

2. 更灵活的实现(拉模型)

// 增强的观察者接口
public interface EnhancedObserver {void update(Subject subject);
}// 增强的主题类
public class WeatherStation implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;private float humidity;public void setMeasurements(float temp, float humidity) {this.temperature = temp;this.humidity = humidity;notifyObservers();}// getter方法public float getTemperature() { return temperature; }public float getHumidity() { return humidity; }// 其他Subject接口实现...
}// 具体观察者 - 天气显示
public class CurrentConditionsDisplay implements EnhancedObserver {public void update(Subject subject) {if (subject instanceof WeatherStation) {WeatherStation ws = (WeatherStation) subject;System.out.printf("当前温度: %.1f°C, 湿度: %.1f%%\n", ws.getTemperature(), ws.getHumidity());}}
}

四、观察者模式的应用场景

1. 事件驱动系统

// 事件管理器
public class EventManager {private Map<String, List<EventListener>> listeners = new HashMap<>();public void subscribe(String eventType, EventListener listener) {listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(listener);}public void unsubscribe(String eventType, EventListener listener) {List<EventListener> eventListeners = listeners.get(eventType);if (eventListeners != null) {eventListeners.remove(listener);}}public void notify(String eventType, String data) {List<EventListener> eventListeners = listeners.get(eventType);if (eventListeners != null) {for (EventListener listener : eventListeners) {listener.update(data);}}}
}

2. 股票价格提醒

public class StockMarket {private Map<String, Double> prices = new HashMap<>();private List<StockObserver> observers = new ArrayList<>();public void addObserver(StockObserver o) {observers.add(o);}public void updatePrice(String symbol, double price) {prices.put(symbol, price);notifyObservers(symbol, price);}private void notifyObservers(String symbol, double price) {for (StockObserver o : observers) {o.onPriceChanged(symbol, price);}}
}public interface StockObserver {void onPriceChanged(String symbol, double price);
}

3. Reactor模式(网络事件)

public class Reactor {private List<EventHandler> handlers = new ArrayList<>();public void registerHandler(EventHandler handler) {handlers.add(handler);}public void handleEvents() {while (true) {Event event = waitForEvent();for (EventHandler h : handlers) {if (h.canHandle(event)) {h.handle(event);}}}}
}

五、观察者模式的变体

1. 使用Java内置Observable类(已废弃)

// 不推荐使用,仅作示例
public class ObservableValue extends java.util.Observable {private int value;public void setValue(int value) {this.value = value;setChanged();notifyObservers(value);}
}

2. 使用Java 9+的Flow API

import java.util.concurrent.Flow.*;public class NewsPublisher implements Publisher<String> {private SubmissionPublisher<String> publisher = new SubmissionPublisher<>();public void subscribe(Subscriber<? super String> subscriber) {publisher.subscribe(subscriber);}public void publish(String news) {publisher.submit(news);}
}public class NewsSubscriber implements Subscriber<String> {private Subscription subscription;public void onSubscribe(Subscription subscription) {this.subscription = subscription;subscription.request(1);}public void onNext(String item) {System.out.println("收到新闻: " + item);subscription.request(1);}// 其他方法实现...
}

六、观察者模式的优缺点

优点

  1. 解耦:主题和观察者松耦合
  2. 动态关系:可运行时添加/删除观察者
  3. 广播通信:一对多通知效率高
  4. 开闭原则:新增观察者无需修改主题

缺点

  1. 通知顺序:观察者通知顺序不确定
  2. 性能问题:观察者过多时通知耗时
  3. 循环依赖:可能导致循环调用
  4. 内存泄漏:需手动取消注册

七、最佳实践

  1. 使用弱引用:防止观察者导致内存泄漏
  2. 异步通知:耗时观察者使用异步方式
  3. 批量通知:高频更新可合并通知
  4. 异常处理:单个观察者异常不应影响其他
  5. 考虑线程安全:多线程环境下的安全性

八、总结

观察者模式是事件处理的核心模式,特别适用于:

  • 需要维护对象间的一致性
  • 需要实现事件通知机制
  • 对象变化需要通知其他对象
  • 需要广播通信的场景

在实际开发中,观察者模式常见于:

  • GUI事件处理(如按钮点击)
  • 发布-订阅系统
  • 实时数据监控
  • MVC架构中的模型-视图通信
  • 响应式编程框架

正确使用观察者模式可以实现松耦合的设计,但需要注意避免过度使用导致的性能问题。

http://www.dtcms.com/wzjs/140613.html

相关文章:

  • 贵阳模板做网站百度公司的企业文化
  • 做网上商城网站哪家好网站制作公司哪家好
  • 建设企业和建筑企业成都seo公司
  • 翻译网站开发百度排名工具
  • 开发网站app公司湛江seo网站管理
  • 我的文章被其他公司网站抄袭怎么做做电商一个月能挣多少钱
  • wordpress rss 爬取上海牛巨微seo优化
  • 网站被墙检测百度网址是什么
  • 中国人民大学建设处网站主页app开发公司有哪些
  • 网站建设客服工作交换友情链接是什么意思
  • 建设银行官方网站客户资料修改tool站长工具
  • 通化市城乡建设局网站今天重大新闻头条新闻军事
  • 鹤壁做网站价格海南乐秀同城群软件下载
  • 专业网站建设空间网络推广软件哪个好
  • 国外免费b2b百度seo推广价格
  • 网站参数修改app搜索优化
  • 云南营销型网站建设互联网营销师在哪里报名
  • 做网站备案完成之后需要干什么环球军事网最新军事新闻最新消息
  • 凤岗仿做网站蚌埠网络推广
  • 做交易网站需要办什么证关键词优化报价推荐
  • 合肥本地建网站长春做网络优化的公司
  • 企业网站 html模板下载搜索引擎优化培训免费咨询
  • 汉中建设工程招标网湖南seo服务电话
  • 10元网站备案学校招生网络营销方案
  • dwcs6网页设计教程seo职位具体做什么
  • 小程序免费制作平台教学推广seo公司
  • 深圳公司举报网站seo岗位
  • 中国商标设计网seo每天一贴
  • 网站建设企业网银e路通重庆百度搜索优化
  • 个人网站可以做充值网页入口网站推广