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

做淘宝网站的上海优化seo排名

做淘宝网站的,上海优化seo排名,青岛独立站开发公司,建设银行网站怎么查工资明细订阅消费模式(发布-订阅模式)和观察者模式在概念和实现上有许多相似之处,但它们在设计目标、应用场景和实现细节上存在一些关键区别。以下从多个角度详细分析两者的具体区别,并结合代码和场景进行说明。 1. 概念上的区别 观察者模…

订阅消费模式(发布-订阅模式)和观察者模式在概念和实现上有许多相似之处,但它们在设计目标、应用场景和实现细节上存在一些关键区别。以下从多个角度详细分析两者的具体区别,并结合代码和场景进行说明。


1. 概念上的区别

观察者模式 (Observer Pattern)

  • 定义:观察者模式定义了一种一对多的依赖关系,当一个对象(被观察者/Subject)的状态发生变化时,所有依赖它的对象(观察者/Observer)都会被通知并自动更新。
  • 核心:被观察者直接管理观察者列表,并直接调用观察者的方法进行通知。
  • 耦合性:被观察者和观察者之间通常存在一定的耦合,被观察者需要知道观察者的具体接口或方法。

订阅消费模式 (Publish-Subscribe Pattern)

  • 定义:发布-订阅模式通过一个中间层(通常是消息代理或事件总线)实现发布者和订阅者之间的通信,发布者发布事件,订阅者订阅感兴趣的事件。
  • 核心:发布者和订阅者通过事件或消息通道解耦,发布者不需要知道订阅者的存在,订阅者也不需要知道发布者的具体实现。
  • 耦合性:发布者和订阅者完全解耦,中间层负责事件的分发。

总结:观察者模式更像是“主动通知”(被观察者直接调用观察者的方法),而订阅消费模式更像是“事件驱动”(通过中间层分发事件)。


2. 实现上的区别

观察者模式的实现

在观察者模式中,被观察者维护一个观察者列表,并在状态变化时直接调用观察者的 update 方法。以下是简化的代码示例:

import java.util.ArrayList;
import java.util.List;// 被观察者接口
interface Subject {void addObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 观察者接口
interface Observer {void update(String state);
}// 具体被观察者
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String state;public void setState(String state) {this.state = state;notifyObservers();}@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(state); // 直接调用观察者的方法}}
}// 具体观察者
class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String state) {System.out.println(name + " received state update: " + state);}
}// 测试
public class ObserverDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.addObserver(observer1);subject.addObserver(observer2);subject.setState("State 1");}
}

输出

Observer 1 received state update: State 1
Observer 2 received state update: State 1

特点

  • 被观察者 (ConcreteSubject) 直接持有观察者列表,并通过循环调用每个观察者的 update 方法。
  • 观察者必须实现特定的接口 (Observer),被观察者知道观察者的方法签名。

订阅消费模式的实现

在订阅消费模式中,发布者和订阅者通过一个中间层(如事件总线或消息代理)通信。以下是一个简单的实现,模拟事件总线的行为:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;// 事件总线(中间层)
class EventBus {private Map<String, List<Subscriber>> subscribers = new HashMap<>();// 订阅事件public void subscribe(String eventType, Subscriber subscriber) {subscribers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(subscriber);}// 取消订阅public void unsubscribe(String eventType, Subscriber subscriber) {List<Subscriber> subscriberList = subscribers.get(eventType);if (subscriberList != null) {subscriberList.remove(subscriber);}}// 发布事件public void publish(String eventType, String message) {List<Subscriber> subscriberList = subscribers.get(eventType);if (subscriberList != null) {for (Subscriber subscriber : subscriberList) {subscriber.onEvent(eventType, message);}}}
}// 订阅者接口
interface Subscriber {void onEvent(String eventType, String message);
}// 具体发布者
class ConcretePublisher {private EventBus eventBus;public ConcretePublisher(EventBus eventBus) {this.eventBus = eventBus;}public void publishEvent(String eventType, String message) {eventBus.publish(eventType, message);}
}// 具体订阅者
class ConcreteSubscriber implements Subscriber {private String name;public ConcreteSubscriber(String name) {this.name = name;}@Overridepublic void onEvent(String eventType, String message) {System.out.println(name + " received event [" + eventType + "]: " + message);}
}// 测试
public class PubSubDemo {public static void main(String[] args) {EventBus eventBus = new EventBus();// 创建订阅者Subscriber subscriber1 = new ConcreteSubscriber("Subscriber 1");Subscriber subscriber2 = new ConcreteSubscriber("Subscriber 2");// 订阅特定事件类型eventBus.subscribe("stateChange", subscriber1);eventBus.subscribe("stateChange", subscriber2);eventBus.subscribe("otherEvent", subscriber1);// 创建发布者ConcretePublisher publisher = new ConcretePublisher(eventBus);// 发布事件publisher.publishEvent("stateChange", "State changed to X");publisher.publishEvent("otherEvent", "Other event occurred");}
}

输出

Subscriber 1 received event [stateChange]: State changed to X
Subscriber 2 received event [stateChange]: State changed to X
Subscriber 1 received event [otherEvent]: Other event occurred

特点

  • 发布者 (ConcretePublisher) 不直接管理订阅者,而是通过 EventBus 发布事件。
  • 订阅者订阅特定的事件类型 (eventType),而不是直接绑定到某个发布者。
  • EventBus 负责事件的分发,发布者和订阅者之间完全解耦。

3. 关键区别总结

维度观察者模式订阅消费模式
耦合性被观察者和观察者有直接依赖,被观察者需要知道观察者的接口和方法。发布者和订阅者通过中间层(事件总线/消息代理)解耦,互不感知对方的存在。
通知方式被观察者直接调用观察者的方法(同步调用)。事件通过中间层分发,可以是同步或异步,支持更复杂的事件路由。
事件粒度通常针对被观察者的状态变化,观察者接收所有通知。订阅者可以选择订阅特定的事件类型,事件粒度更细。
中间层没有中间层,被观察者直接管理观察者列表。有中间层(如事件总线、消息队列),负责事件的分发和路由。
适用场景适用于简单的、一对多的状态同步场景,如 GUI 事件处理、MVC 模型更新。适用于分布式系统、异步通信、复杂事件驱动场景,如消息队列、微服务事件总线。
实现复杂度实现较简单,适合小型系统。实现较复杂,尤其在分布式系统中需要考虑消息丢失、顺序等问题。

4. 具体使用场景对比

观察者模式场景

  • GUI 事件处理:在 Java 的 Swing 或 JavaFX 中,按钮被点击时通知所有注册的监听器。例如,ActionListener 监听按钮的点击事件。
  • MVC 架构:模型(Model)状态变化时通知视图(View)更新界面。
  • 实时数据更新:一个股票价格对象(被观察者)更新时,通知所有订阅它的仪表盘(观察者)。

为何用观察者模式:这些场景中,被观察者和观察者通常在同一进程内,通信是同步的,且耦合关系明确。

订阅消费模式场景

  • 消息队列系统:在分布式系统中,使用 RabbitMQ 或 Kafka,生产者发布消息到队列,消费者订阅特定主题的消息。
  • 微服务事件驱动架构:一个订单服务发布“订单创建”事件,支付服务和库存服务订阅并处理。
  • 日志系统:一个应用发布日志事件,多个日志处理器(如文件存储、远程服务器)订阅并处理。

为何用订阅消费模式:这些场景需要高度解耦,支持异步通信,且发布者和订阅者可能在不同进程或服务器上。


5. 代码层面的直观对比

  • 观察者模式:被观察者直接调用观察者的方法,代码结构简单,但耦合紧密。

    subject.notifyObservers(); // 直接调用
    
  • 订阅消费模式:发布者通过事件总线发布事件,订阅者通过事件类型匹配接收,代码结构更灵活,但需要中间层支持。

    eventBus.publish("stateChange", message); // 通过事件总线分发
    

6. 总结

  • 观察者模式更适合同步一对多状态依赖的场景,发布者和订阅者有明确的依赖关系,适用于本地、单进程的简单系统。
  • 订阅消费模式更适合异步事件驱动高度解耦的场景,通过中间层支持复杂的事件分发,适用于分布式系统或跨进程通信。

在 Java 开发中:

  • 如果你在开发 GUI 应用、MVC 架构或简单的状态同步逻辑,观察者模式可能是更好的选择。
  • 如果你在构建微服务、消息队列系统或需要细粒度事件处理的复杂系统,订阅消费模式更合适。
http://www.dtcms.com/wzjs/481471.html

相关文章:

  • 浙江网站建设哪里有友情链接英文翻译
  • wordpress 数据库导入数据库文件站长工具seo查询5g5g
  • 用php做的旅游网站企业培训
  • 为何建设银行的网站登不上去爱站网站
  • 网站浮动窗口怎么做抄一则新闻四年级
  • 网站建设专家联系方式做高端网站公司
  • 网站建设时间进度表南宁seo平台标准
  • 有什么可以做试卷题目的网站小红书笔记关键词排名优化
  • 网站广告弹出来代码网络推广软文
  • 档案安全网站安全建设网店如何做推广
  • 石家庄网站制作找谁今日热榜官网
  • 如何外贸seo网站建设专业网站建设公司
  • 投资网站建设软件制作平台
  • 怎么把自己做的网站放到百度上今日的重大新闻
  • 用万网做网站网络营销与管理
  • 河南郑州暴雨百度seo快速见效方法
  • 微信小程序制作网站搜索排名优化
  • cms网站制作怎么免费注册域名
  • 北京哪家做网站优化公司网站搭建
  • 高端网站建设 骆域名服务器查询
  • 开封景区网站建设方案百度应用
  • 文章博客媒体网站模板seo什么意思中文意思
  • 导航网站的网站地图怎么做今日热点新闻
  • 如何开发小程序商城seo综合查询爱站
  • 网站营销学多久武汉seo优化分析
  • 柳州网站网站建设今日国际新闻10条
  • 东莞整站优化公司火速公司天津seo数据监控
  • 兰州网站建设公司价格aso优化的主要内容
  • 成都 网站建设培训南昌seo排名公司
  • 怎么注册免费个人网站班级优化大师app下载