导航

  • 一、行为描述
  • 二、角色关系
  • 三、代码示例

一、行为描述

观察者会观察特定对象的状态变化,一旦状态有所变化或产生特定条件,被观察对象会通知给观察者,
而观察者则会依据通知信息采取特定处理措施。

举个例子,公司接到了一个大项目,各个部门都在观察项目的进度,一旦洽谈成功,项目正式进入启动阶段,
那么设计部就会出图纸,开发部就会出流程、出架构,售前部就会跑现场实地勘测…
项目就是被观察者,而各个部门就是观察者。

二、角色关系

观察者模式就两种角色——观察者和被观察者。

观察者对象往往会规范结构,一般是继承一个抽象观察者

I. 抽象观察者会定义3个重要内容

  1. 被观察对象的引用
  2. 构造函数——赋值被观察者、将this加入观察席
  3. 通知函数

II. 子类观察者仅调用父类构造,并实现通知函数即可。

III. 被观察者需要定义 4 个重要内容:

  1. 状态变量。这是观察者存在的目的和关键。
  2. 观察席。简单的说就是一个容纳观察者对象的容器,可以是List、也可以是Map,甚至是数组。
  3. 入席函数。观察者应该在构造的时候通过入席函数将自身加入到观察席容器中。
  4. 广播函数。与观察者的通知函数一样,被观察者应该在状态变化时(可以是 setter 函数)调用观察席中各个观察者的通知方法。

三、代码示例

抽象观察者:

/*** 观察者*/
@Data
public abstract class Observer {/*** 被观察对象*/protected ObserveTarget target;/*** 构造观察者时,直接建立观察者与被观察者的关系*/public Observer(ObserveTarget target) {this.target = target;target.getObservers().add(this);}/*** 接收广播消息*/abstract void recvMsg();
}

观察者1、观察者2:

/*** 观察者1号*/
public class Observer1 extends Observer {public Observer1(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {System.out.println("Observer1-state = " + target.getState());}
}
/*** 观察者2号*/
public class Observer2 extends Observer {public Observer2(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {// 观察者可以视情况选择性处理接收的消息if (target.getState() == 1)System.out.println("Observer2-state = " + target.getState());}
}

被观察者:

/*** 被观察目标*/
@Data
public class ObserveTarget {/*** 状态变量*/private volatile int state;/*** 观察席(观察者容器)*/private Collection<Observer> observers = new ArrayList<>();/*** 入席函数(新增观察者)*/public void addObserver(Observer observer) {observers.add(observer);}public void setState(int state) {this.state = state;// 发送广播通知broadcast();}/*** 广播函数*/private void broadcast() {observers.forEach(o -> o.recvMsg());}
}

测试代码:

public class TestObserve {public static void main(String[] args) {ObserveTarget target = new ObserveTarget();Observer1 observer1 = new Observer1(target);Observer2 observer2 = new Observer2(target);target.setState(1);target.setState(2);target.setState(3);}
}
// output:
Observer1-state = 1
Observer2-state = 1
Observer1-state = 2
Observer1-state = 3

Java常用设计模式——观察者模式相关推荐

  1. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  2. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  3. java常用设计模式文章收集

    java常用设计模式文章收集 java设计模式--接口模式 java设计模式--抽象工厂模式 java设计模式--工厂模式 Java设计模式--迭代器模式 Java设计模式--原型模式 JAVA设计模 ...

  4. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

  5. 初学Java常用设计模式之——装饰器模式

    声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...

  6. Java常用设计模式(一)

      当代软件开发中,设计模式已经成为一种标准的编程实践.在Java编程中,设计模式也同样重要.Java设计模式是软件开发中广泛应用的一种编程方法,它可以帮助开发人员更快地编写出高效.可靠和可维护的代码 ...

  7. java常用设计模式 看了她,改变你的一生~~~

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  8. java常用设计模式应用案例

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把 很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的 ...

  9. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map;/*** 设计模式之单例模式* 单例模式(Singleton Pattern) ...

最新文章

  1. validate做前端表单验证
  2. elasticsearch 6.6 安装(CentOS 7.5) 修订
  3. 在线阅读!!机器学习数学精华:线性代数
  4. python之itemgetter函数:对字典列表进行多键排序
  5. CodeForces - 1316C Primitive Primes(构造+数论)
  6. Sahi ---实现 Web 自动化测试
  7. 了解 object.defineProperty 的基本使用方法(数据双向绑定的底层原理)
  8. Elon Musk发起投票,超7成参与者认为狗狗币是地球未来货币
  9. Eclipse日常踩坑记录——导入文件时遇到的几个问题
  10. VS2008中英文转换
  11. vscode 中的 Lammps Syntax Highlighting 插件
  12. 雄迈摄像头ffmpeg转码推送至websocket
  13. win10做文件服务器怎么精简,win10精简系统怎么做到
  14. 计算机硬件系统基本组成
  15. 云展网教程 | 如何更改logo和设置点击logo时的转跳链接?
  16. 个人知识管理(PKM)实施
  17. Redis远程连接不上解决办法
  18. Python实现某du内容下载, 保存到word文档
  19. 普陀区科技创新型小巨人企业
  20. PTA 1055 集体照 (25 分) C++实现

热门文章

  1. 带有Python示例的math.exp()方法
  2. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
  3. 【Python】输入任意个数元素并保存至列表
  4. python基本的信号与槽函数的使用 信号发射 槽函数接收
  5. android高仿天天动听,Android仿天天动听歌曲自动滚动view
  6. select的列子说明select内部实现原理
  7. 计算机应用基础第二章,计算机应用基础第二章上机操作题
  8. android 怎么调用js项目_APP逆向神器之Frida【Android初级篇】
  9. fp算法例题_机器学习(九)—FP-growth算法
  10. linux mei swap,Linux swapoff命令