您现在的位置是:亿华云 > 域名

设计模式系列之观察者模式

亿华云2025-10-04 04:04:13【域名】9人已围观

简介本文转载自微信公众号「狼王编程」,作者狼王 。转载本文请联系狼王编程公众号。大家好,我是狼王,一个爱打球的程序员这篇让我们来认识一下观察者模式1、概述观察者模式是一种行为设计模式, 允许你定义一种订阅

本文转载自微信公众号「狼王编程」,设计作者狼王 。模式模式转载本文请联系狼王编程公众号。系列

大家好,设计我是模式模式狼王,一个爱打球的系列程序员

这篇让我们来认识一下观察者模式

1、概述

观察者模式是设计一种行为设计模式, 允许你定义一种订阅机制,模式模式 可在对象事件发生时通知多个 “观察” 该对象的系列其他对象。

2、设计适用场景

1)当一个对象状态的模式模式改变需要改变其他对象, 或实际对象是系列事先未知的云南idc服务商或动态变化时, 可使用观察者模式。设计

2) 当应用中的模式模式一些对象必须观察其他对象时,可使用该模式。系列但仅能在有限时间内或特定情况下使用。订阅者可随时加入或离开该列表。

3、实例

有以下场景:

有一个小区,需要进行核酸检测。 假设每个人通过关注公众号获取核酸检测结果。 

发布者接口:

/**  * 发布接口  */ public interface IPublisher {      /**      * 发布事件      * @param event      */     void publish(IEvent event); } 

订阅者接口:

/**  * 通用订阅接口  */ public interface ISubscriber {      /**      * 查看结果      */     void look(); } 

事件接口:

/**  * 通用事件接口  */ public interface IEvent {      /**      * 打印事件信息      */     void print(); } 

消息发送者

/**  * 消息发送者  */ public class Publisher implements IPublisher{      private IEvent event;     private List<ISubscriber> subscribers;     public Publisher(IEvent event, List<ISubscriber> subscribers) {          this.event = event;         this.subscribers = subscribers;     }     /**      * 发布消息      * @param event      */     @Override     public void publish(IEvent event){          event.print();     }     public IEvent getEvent() {          return event;     }     public void setEvent(IEvent event) {          this.event = event;     }     public List<ISubscriber> getSubscribers() {          return subscribers;     }     public void setSubscribers(List<ISubscriber> subscribers) {          this.subscribers = subscribers;     } } 

事件:

/**  * 检测事件  */ public class CheckEvent implements IEvent{      private String name;     private String result;     private ISubscriber subscriber;     public ISubscriber getSubscriber() {          return subscriber;     }     public void setSubscriber(ISubscriber subscriber) {          this.subscriber = subscriber;     }     public CheckEvent(String name) {          this.name = name;     }     @Override     public void print() {          subscriber.look();         System.out.println("事件名称:" + name);         System.out.println("事件结果:" + result);     }     public String getName() {          return name;     }     public void setName(String name) {          this.name = name;     }     public String getResult() {          return result;     }     public void setResult(String result) {          this.result = result;     } } 

订阅者:

/**  * 订阅者  */ public class User implements ISubscriber{      private String name;     public User(String name) {          this.name = name;     }     public String getName() {          return name;     }     public void setName(String name) {          this.name = name;     }     @Override     public void look() {          System.out.println("检测姓名:" + name);     } } 

客户端:

/**  * 测试类  */ public class TestDemo {      public static void main(String[] args) {          //定义两种结果         String[] doc = { "阴性", "阳性"};         //初始化检测事件         CheckEvent check = new CheckEvent("核酸检测");         //初始化消息发布者         Publisher publisher = new Publisher(check,new ArrayList<>());         //实例化接受检测的用户         List<ISubscriber> users = new ArrayList<>();         for (int i = 0; i < 10; i++) {              //初始化用户             User user = new User("狼王" + i);             users.add(user);         }         //用户订阅事件         publisher.setSubscribers(users);         int index;         //发布检测结果         for (int i = 0; i < 10; i++) {              System.out.println("---------------");             //随机检测结果             index = (int) (Math.random() * doc.length);             check.setSubscriber(users.get(i));             check.setResult(doc[index]);             //发布             publisher.publish(check);         }     } } 

结果:

--------------- 检测姓名:狼王0 事件名称:核酸检测 事件结果:阴性 --------------- 检测姓名:狼王1 事件名称:核酸检测 事件结果:阴性 --------------- 检测姓名:狼王2 事件名称:核酸检测 事件结果:阳性 --------------- 检测姓名:狼王3 事件名称:核酸检测 事件结果:阴性 --------------- 检测姓名:狼王4 事件名称:核酸检测 事件结果:阳性 --------------- 检测姓名:狼王5 事件名称:核酸检测 事件结果:阳性 --------------- 检测姓名:狼王6 事件名称:核酸检测 事件结果:阳性 --------------- 检测姓名:狼王7 事件名称:核酸检测 事件结果:阴性 --------------- 检测姓名:狼王8 事件名称:核酸检测 事件结果:阴性 --------------- 检测姓名:狼王9 事件名称:核酸检测 事件结果:阴性 

4、分析

代码依赖关系如下图所示:

分别定义了三个接口:事件接口,消息发布者接口,消息订阅者接口每个接口有其对应的实现。源码下载

这样设计利于后续的扩展,在不同的事件和不同的订阅者以及消息发布者,都可以进行扩展而不影响其他。

5、总结

优点:

1)开闭原则

2)业务代码解耦,具体消息订阅者和发布者没有直接关联。

缺点:

1)多个消费者存在的时候,可能会无法控制顺序和时间较长。 

好了。今天就说到这了,我还会不断分享自己的所学所想,希望我们一起走在成功的云服务器提供商道路上!

很赞哦!(24)