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

轮播网站wordpress调用规则

轮播网站,wordpress调用规则,淘宝搜索框去什么网站做,实体店营销方案#x1f44b;hi#xff0c;我不是一名外包公司的员工#xff0c;也不会偷吃茶水间的零食#xff0c;我的梦想是能写高端CRUD #x1f525; 2025本人正在沉淀中… 博客更新速度 #x1f44d; 欢迎点赞、收藏、关注#xff0c;跟上我的更新节奏 #x1f3b5; 当你的天空突… hi我不是一名外包公司的员工也不会偷吃茶水间的零食我的梦想是能写高端CRUD 2025本人正在沉淀中… 博客更新速度 欢迎点赞、收藏、关注跟上我的更新节奏 当你的天空突然下了大雨那是我在为你炸乌云 文章目录 一、入门什么是观察者模式为什么要观察者模式怎么实现观察者模式 二、观察者模式在源码中运用Java 中的 java.util.Observer 和 java.util.ObservableObserver和Observable的使用Observer和Observable的源码实现 Spring 框架中的事件机制Spring事件机制的使用Spring的事件机质的源码实现 三、总结观察者模式的优点观察者模式的缺点观察者模式的适用场景 参考 一、入门 什么是观察者模式 观察者模式Observer Pattern是一种行为设计模式它定义了对象之间的一对多依赖关系当一个对象的状态发生改变时所有依赖于它的对象都会收到通知并自动更新。 为什么要观察者模式 假设我们正在开发一个天气预报系统其中 WeatherStation气象站负责收集天气数据如温度、湿度等。Display显示设备负责显示天气数据比如手机App、电子屏等。 当气象站的数据更新时所有显示设备都需要实时更新显示内容。 下面是没有观察者模式时的实现 class WeatherStation {private float temperature;private float humidity;private PhoneDisplay phoneDisplay;private TVDisplay tvDisplay;public void setPhoneDisplay(PhoneDisplay phoneDisplay) {this.phoneDisplay phoneDisplay;}public void setTVDisplay(TVDisplay tvDisplay) {this.tvDisplay tvDisplay;}public void removePhoneDisplay() {phoneDisplay null;}public void removeTVDisplay() {phoneDisplay null;}public void setMeasurements(float temperature, float humidity) {this.temperature temperature;this.humidity humidity;// 手动调用显示设备的更新方法if (phoneDisplay ! null) {phoneDisplay.update(temperature, humidity);}if (tvDisplay ! null) {tvDisplay.update(temperature, humidity);}} }紧耦合 如果没有观察者模式气象站需要直接知道所有显示设备的存在并手动调用它们的更新方法。例如 问题 气象站和显示设备之间是紧耦合的气象站需要知道所有显示设备的具体实现。如果新增一个显示设备比如智能手表需要修改气象站的代码违反了开闭原则对扩展开放对修改关闭。 难以动态管理依赖 如果显示设备需要动态添加或移除比如用户关闭了某个显示设备气象站需要手动管理这些设备的引用。 扩展性差 如果未来需要支持更多类型的观察者比如日志记录器、报警系统等气象站的代码会变得越来越臃肿难以维护。 怎么实现观察者模式 在观察者模式中有如下角色 Subject抽象主题抽象被观察者抽象主题角色把所有观察者对象保存在一个集合里每个主题都可以有任意数量的观察者抽象主题提供一个接口可以增加和删除观察者对象。ConcreteSubject具体主题具体被观察者该角色将有关状态存入具体观察者对象在具体主题的内部状态发生改变时给所有注册过的观察者发送通知。Observer抽象观察者是观察者的抽象类它定义了一个更新接口使得在得到主题更改通知时更新自己。ConcrereObserver具体观察者实现抽象观察者定义的更新接口以便在得到主题更改通知时更新自身的状态。 【案例】天气站 - 改 Observer观察者: Observer接口 interface Observer {void update(float temperature, float humidity); }Subject主题: subject接口 interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(); }实现具体主题气象站: WeatherStation类 class WeatherStation implements Subject {private ListObserver observers new ArrayList();private float temperature;private float humidity;Overridepublic void registerObserver(Observer observer) {observers.add(observer);}Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity);}}public void setMeasurements(float temperature, float humidity) {this.temperature temperature;this.humidity humidity;notifyObservers(); // 通知所有观察者} }实现具体观察者显示设备: PhoneDisplay类和TVDisplay类 class PhoneDisplay implements Observer {Overridepublic void update(float temperature, float humidity) {System.out.println(手机显示温度 temperature 湿度 humidity);} }class TVDisplay implements Observer {Overridepublic void update(float temperature, float humidity) {System.out.println(电视显示温度 temperature 湿度 humidity);} }测试类 public class WeatherApp {public static void main(String[] args) {WeatherStation weatherStation new WeatherStation();Observer phoneDisplay new PhoneDisplay();Observer tvDisplay new TVDisplay();weatherStation.registerObserver(phoneDisplay);weatherStation.registerObserver(tvDisplay);// 更新天气数据weatherStation.setMeasurements(25.5f, 60.0f);// 移除一个观察者weatherStation.removeObserver(tvDisplay);// 再次更新天气数据weatherStation.setMeasurements(26.0f, 58.0f);} }运行结果 手机显示温度 25.5湿度 60.0 电视显示温度 25.5湿度 60.0 手机显示温度 26.0湿度 58.0二、观察者模式在源码中运用 Java 中的 java.util.Observer 和 java.util.Observable Java 标准库中提供了观察者模式的实现分别是 Observer 接口和 Observable 类。 Observable 是被观察者的基类内部维护了一个观察者列表并提供了 addObserver、deleteObserver 和 notifyObservers 方法。Observer 是观察者接口定义了 update 方法用于接收通知。 Observer和Observable的使用 被观察者(具体主题):WeatherData类 // 被观察者主题 class WeatherData extends Observable {private float temperature;private float humidity;public void setMeasurements(float temperature, float humidity) {this.temperature temperature;this.humidity humidity;setChanged(); // 标记状态已改变notifyObservers(); // 通知观察者}public float getTemperature() {return temperature;}public float getHumidity() {return humidity;} }观察者(具体观察者): Display类 // 观察者 class Display implements Observer {Overridepublic void update(Observable o, Object arg) {if (o instanceof WeatherData) {WeatherData weatherData (WeatherData) o;float temperature weatherData.getTemperature();float humidity weatherData.getHumidity();System.out.println(当前温度: temperature 湿度: humidity);}} }测试 public class ObserverPatternDemo {public static void main(String[] args) {WeatherData weatherData new WeatherData();Display display new Display();weatherData.addObserver(display); // 注册观察者weatherData.setMeasurements(25.5f, 60.0f); // 更新数据并通知观察者} }输出结果 当前温度: 25.5湿度: 60.0Observer和Observable的源码实现 观察者:Observer类入参Observable o被观察的对象主题和 Object arg传递给观察者的额外参数可选。 public interface Observer {void update(Observable o, Object arg); }主题Observable类。 我们可以看到VectorObserver存储观察者列表。并且因为加了synchronized关键字这些方法都是线程安全的。notifyObservers方法会遍历观察者列表并调用每个观察者的update方法。 public class Observable {// 标记对象是否已改变private boolean changed false;// 观察者列表使用 Vector 保证线程安全private VectorObserver obs;public Observable() {obs new Vector();}// 添加观察者public synchronized void addObserver(Observer o) {if (o null)throw new NullPointerException();if (!obs.contains(o)) {obs.addElement(o);}}// 删除观察者public synchronized void deleteObserver(Observer o) {obs.removeElement(o);}// 通知所有观察者无参数public void notifyObservers() {notifyObservers(null);}// 通知所有观察者带参数public void notifyObservers(Object arg) {Observer[] arrLocal;// 同步块确保线程安全synchronized (this) {if (!changed) // 如果没有变化直接返回return;arrLocal obs.toArray(new Observer[obs.size()]);clearChanged(); // 重置变化标志}// 遍历观察者列表调用 update 方法for (Observer observer : arrLocal) {observer.update(this, arg);}}// 删除所有观察者public synchronized void deleteObservers() {obs.removeAllElements();}// 标记对象已改变protected synchronized void setChanged() {changed true;}// 重置变化标志protected synchronized void clearChanged() {changed false;}// 检查对象是否已改变public synchronized boolean hasChanged() {return changed;}// 返回观察者数量public synchronized int countObservers() {return obs.size();} }Spring 框架中的事件机制 Spring 框架中的事件机制是基于观察者模式实现的。它允许开发者定义自定义事件并通过监听器观察者来处理这些事件。 Spring事件机制的使用 自定义事件 class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() {return message;} }事件监听器观察者 Component class CustomEventListener implements ApplicationListenerCustomEvent {Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println(收到事件: event.getMessage());} }事件发布者 Component class CustomEventPublisher {private final AnnotationConfigApplicationContext context;public CustomEventPublisher(AnnotationConfigApplicationContext context) {this.context context;}public void publishEvent(String message) {context.publishEvent(new CustomEvent(this, message));} }配置类 Configuration ComponentScan class AppConfig {}测试类 public class SpringEventDemo {public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);CustomEventPublisher publisher context.getBean(CustomEventPublisher.class);publisher.publishEvent(Hello, Spring Event!);context.close();} }输出内容 收到事件: Hello, Spring Event!Spring的事件机质的源码实现 Spring 事件机制的核心组件包括 ApplicationEvent事件的基类所有自定义事件都需要继承它。对应观察者模式中的“事件”。ApplicationListener观察者接口定义了处理事件的方法。对应观察者模式中的“观察者”。ApplicationEventPublisher事件发布者接口用于发布事件。对应观察者模式中的“主题”。ApplicationEventMulticaster事件广播器负责将事件分发给所有监听器。类似于观察者模式中的“通知机制”。 ApplicationEvent 类ApplicationEvent 是所有事件的基类它继承自 java.util.EventObject。 public abstract class ApplicationEvent extends EventObject {private final long timestamp; // timestamp: 事件发生的时间戳。public ApplicationEvent(Object source) { // source:事件源通常是发布事件的对象。super(source);this.timestamp System.currentTimeMillis();}public final long getTimestamp() {return this.timestamp;} }ApplicationListener接口: ApplicationListener是观察者接口定义了处理事件的方法。 FunctionalInterface public interface ApplicationListenerE extends ApplicationEvent extends EventListener {void onApplicationEvent(E event); // 当事件发生时会调用此方法。 }ApplicationEventPublisher接口 是事件发布者接口用于发布事件。 FunctionalInterface public interface ApplicationEventPublisher {default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}void publishEvent(Object event); }ApplicationEventMulticaster接口是事件广播器接口负责将事件分发给所有监听器。 public interface ApplicationEventMulticaster {void addApplicationListener(ApplicationListener? listener);void addApplicationListenerBean(String listenerBeanName);void removeApplicationListener(ApplicationListener? listener);void removeApplicationListenerBean(String listenerBeanName);void removeAllListeners();void multicastEvent(ApplicationEvent event); void multicastEvent(ApplicationEvent event, ResolvableType eventType); }SimpleApplicationEventMulticaster 类SimpleApplicationEventMulticaster是ApplicationEventMulticaster的默认实现类。 public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {// 遍历所有监听器并调用 onApplicationEvent 方法。Overridepublic void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {ResolvableType type (eventType ! null ? eventType : resolveDefaultEventType(event));for (final ApplicationListener? listener : getApplicationListeners(event, type)) {Executor executor getTaskExecutor();if (executor ! null) {executor.execute(() - invokeListener(listener, event));} else {invokeListener(listener, event);}}}// 实际调用监听器的 onApplicationEvent 方法。protected void invokeListener(ApplicationListener? listener, ApplicationEvent event) {try {listener.onApplicationEvent(event);} catch (ClassCastException ex) {// 处理类型转换异常}} }三、总结 观察者模式的优点 解耦主题Subject和观察者Observer之间是松耦合的主题不需要知道观察者的具体实现只需要知道观察者接口观察者也不需要知道主题的具体实现只需要实现观察者接口 动态管理依赖观察者可以动态注册和注销而不需要修改主题的代码。支持运行时动态添加或移除观察者灵活性高。 符合开闭原则可以轻松添加新的观察者而不需要修改主题的代码。主题的代码不需要因为观察者的变化而修改。 广播通信主题可以一次性通知所有观察者适合一对多的通信场景。观察者可以根据需要选择是否响应通知。 职责分离主题负责维护状态和通知观察者。观察者负责处理状态变化的逻辑。职责分离使得代码更加清晰和可维护。 观察者模式的缺点 性能问题 如果观察者数量非常多通知所有观察者可能会消耗大量时间。如果观察者的处理逻辑复杂可能会导致性能瓶颈。 内存泄漏 如果观察者没有正确注销可能会导致观察者无法被垃圾回收从而引发内存泄漏。特别是在长时间运行的应用中需要特别注意观察者的生命周期管理。 调试困难 由于观察者和主题是松耦合的调试时可能难以追踪事件的传递路径。如果观察者的处理逻辑出现问题可能不容易定位问题根源。 事件顺序不确定 观察者收到通知的顺序通常是不确定的如果业务逻辑对顺序有要求可能需要额外的处理。 观察者模式的适用场景 事件驱动系统 当一个对象的状态变化需要触发其他对象的操作时可以使用观察者模式。例如GUI 框架中的按钮点击事件、Spring 框架中的事件机制。 一对多的依赖关系 当一个对象的状态变化需要通知多个其他对象时可以使用观察者模式。例如气象站和多个显示设备的关系。 跨系统的消息通知 在分布式系统中观察者模式可以用于实现消息的发布和订阅。例如消息队列MQ中的发布-订阅模型。 状态变化的广播 当一个对象的状态变化需要广播给多个对象时可以使用观察者模式。例如游戏中的角色状态变化通知其他系统如 UI、音效等。 解耦业务逻辑 当需要将业务逻辑解耦为多个独立的模块时可以使用观察者模式。例如订单系统中的订单状态变化通知库存系统、物流系统等。 参考 黑马程序员Java设计模式详解 23种Java设计模式图解框架源码分析实战_哔哩哔哩_bilibili
http://www.laogonggong.com/news/107935.html

相关文章:

  • 新安网站开发人人开发网站
  • 做网站设计都需要什么软件php网站开发数据列表排重
  • 网站维护的基本内容包括哪些网站建设服务器配置
  • 南昌城乡住房建设厅网站久久医药网
  • 模板网站的劣势成都网站公司
  • 语言网站开发徐州免费网站建设
  • php网站开发视频网站建设空间选择的重要性
  • 在家接做网站宝塔一键迁移WordPress
  • 做upc条形码的网站网站建设的税收分类编码
  • 途牛网站建设内蒙古建设工程交易服务中心网站
  • 南昌珠峰网站建设商务 服务类网站模板
  • 玖壹购网站是做啥子的企业网站建设项目描述
  • 临安区建设局网站大丰做网站价格
  • 趣图在线生成网站源码泰塔科技网站建设
  • 教育网站改版方案用cms创建自己带数据库的网站和在本机搭建网站运行平台的心得体会
  • 重庆网站制作公司重庆wordpress如何用nginx
  • 福田网站设计贵州建设水利厅考试网站
  • 网站建设得花多少钱注册外贸网站有哪些
  • wordpress通过电子邮件发布google seo 营销网站
  • 网站维护公司广州新手制作网站工具
  • 苏州网站设计制作公司WordPress小程序导航栏
  • 用云主机做网站猪八戒网站开发
  • 关于门户网站建设网络推广专员
  • 苏州高端网站制作网站顶部flash下载
  • .top和网站学校网站群建设
  • 做公司网站详细步骤网站备案人授权书
  • 整站seo教程创建全国文明城市调查问卷
  • 省建设厅网站6美食网站开发目的与意义
  • 注册一个做网站的公司好怎么看网站建设
  • 企业定制网站开发维护合同wordpress卸载主题