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

观察者模式(Observer Pattern)

一.定义

(一)观察者模式定义

  • 简介:观察者模式也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则其所有依赖于它的对象都会收到通知并自动更新。

1.Subject被观察者

  • 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责;
  • 职责管理观察者和通知观察者。

2.Observer观察者

  • 观察者接收到消息后,都进行update(更新)操作,对接收到的信息进行处理。

3.ConcreteSubject具体的被观察者

  • 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

4.ConcreteObserver具体的观察者

  • 每个观察者收到消息之后的处理逻辑不同

(二)示例

1.观察者(Observer)

/*** 抽象观察者*/
public interface Observer {/*** 处理逻辑* @param ctx 接收数据上下文*/void dosomething(Object ctx);}

2.被观察者(Subject)

public abstract class Subject {//定义一个观察者集合private Set<Observer> obsSet = new CopyOnWriteArraySet<>();/*** 新增一个观察者* @param observer*/public void addObserver(Observer observer) {obsSet.add(observer);}public void deleteObserver(Observer observer) {obsSet.remove(observer);}/*** 通知观察者可以执行逻辑了* @param ctx*/public void notifyObserver(Object ctx) {for (Observer observer : obsSet) {observer.dosomething(ctx);}}}

3.具体被观察者(ConcreteSubject)

/*** 具体被观察者*/
public class ConcreteSubject extends Subject {public void dosomething(Object data) {//TODO 前置处理data相关逻辑,然后通知观察者super.notifyObserver(data);}
}

4.具体观察者(ConcreteObserver)

/*** 具体观察者*/
public class ConcreteObserver1 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer1 handle data:" + data);}
}/*** 具体观察者*/
public class ConcreteObserver2 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer2 handle data:" + data);}
}

5.高层模块使用

public class Invoker {public static void main(String[] args) {//创建一个被观察者ConcreteSubject subject = new ConcreteSubject();//定义观察者Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();//添加观察者subject.addObserver(observer1);subject.addObserver(observer2);//执行subject.dosomething("data.data.");}
}

二.应用场景

【TODO】


http://www.mrgr.cn/news/12018.html

相关文章:

  • xss-labs通关攻略 11-15关
  • 代码随想录 -- 哈希表 -- 四数相加 II
  • 使用canal增量同步ES索引库数据
  • 主场竞争,安踏把背影留给耐克
  • centos7安装Kafka单节点环境部署三-安装Logstash
  • mysql 导入excel文件 navicate
  • Python 爬虫 示例
  • 如何使用Redis实现乐观锁?
  • 已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!!
  • 惠州本地专业的企业管理咨询公司
  • ansible --limit 在指定主机执行任务
  • 手机号码归属地查询如何用PHP进行调用
  • 算法-有效的字母异位词
  • 算法训练第24天|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II|1005.K次取反后最大化的数组和
  • Swift 中的文本渲染艺术:深入探索 Core Text
  • 阿里云OSS文件存储
  • 分享 11 个常用的 Nginx 性能优化参数工作
  • 介绍一下KAFKA的ACK机制?
  • 只用一个 HTML 元素可以写出多少形状?——不规则图形篇
  • 什么是BI?BI系统的功能有哪些?哪些人需要BI工具支持?