【设计模式】—— 观察者模式Observer
时间:2022-04-22
本文章向大家介绍【设计模式】—— 观察者模式Observer,主要内容包括模式意图、应用场景、模式结构、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模式意图
观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布——其他人接受。
这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化。
模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面。只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程。
这个模式代码相对来说比较容易理解,而且应用很广泛。
应用场景
1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的。就好比一个网站的有web端,也有移动端,当web端的数据发生变化时,移动端的数据展现也要更新。
2 对一个对象发生改变,而不知道将有多少对象会发生改变时,利用这种模式可以有效的管理对象。
模式结构
Subject 抽象的主题角色
interface Subject{
public void attach(Observer observer);
public void detach(Observer observer);
void notifyObservers();
}
ConcreteSubject 具体的主题角色,内部有一个容易,用于存放订阅者
class ConcreteSubject implements Subject{
List<Observer> list = new ArrayList();
public void attach(Observer observer) {
list.add(observer);
}
public void detach(Observer observer) {
list.remove(observer);
}
public void notifyObservers() {
for(Observer o : list){
o.update();
}
}
}
Observer 抽象的订阅者角色
interface Observer{
public void update();
}
ConcreteObserver 具体的订阅者
class ConcreteObserver1 implements Observer{
public void update() {
System.out.println("ConcreteObserver1 update");
}
}
class ConcreteObserver2 implements Observer{
public void update() {
System.out.println("ConcreteObserver2 update");
}
}
class ConcreteObserver3 implements Observer{
public void update() {
System.out.println("ConcreteObserver3 update");
}
}
全部代码
1 package com.xingoo.test.design.observer;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 interface Subject{
7 public void attach(Observer observer);
8 public void detach(Observer observer);
9 void notifyObservers();
10 }
11 class ConcreteSubject implements Subject{
12 List<Observer> list = new ArrayList();
13 public void attach(Observer observer) {
14 list.add(observer);
15 }
16 public void detach(Observer observer) {
17 list.remove(observer);
18 }
19 public void notifyObservers() {
20 for(Observer o : list){
21 o.update();
22 }
23 }
24 }
25 interface Observer{
26 public void update();
27 }
28 class ConcreteObserver1 implements Observer{
29 public void update() {
30 System.out.println("ConcreteObserver1 update");
31 }
32 }
33 class ConcreteObserver2 implements Observer{
34 public void update() {
35 System.out.println("ConcreteObserver2 update");
36 }
37 }
38 class ConcreteObserver3 implements Observer{
39 public void update() {
40 System.out.println("ConcreteObserver3 update");
41 }
42 }
43 public class Client {
44 public static void main(String[] args) {
45 Subject subject = new ConcreteSubject();
46 Observer o1 = new ConcreteObserver1();
47 Observer o2 = new ConcreteObserver2();
48 Observer o3 = new ConcreteObserver3();
49 subject.attach(o1);
50 subject.attach(o2);
51 subject.attach(o3);
52 subject.notifyObservers();
53
54 subject.detach(o2);
55 subject.notifyObservers();
56 }
57 }
运行结果
ConcreteObserver1 update
ConcreteObserver2 update
ConcreteObserver3 update
ConcreteObserver1 update
ConcreteObserver3 update
- 在Java EE7框架中使用MongoDB
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
- iPhone的Wi-Fi芯片漏洞利用POC公布,赶紧更新系统吧
- No.003 Longest Substring Without Repeating Characters
- 【Spark研究】极简 Spark 入门笔记——安装和第一个回归程序
- 通常Java开发人员如何进行数据排序?
- 消息服务框架使用案例之--大文件上传(断点续传)功能
- Java中三种Set类型用法、性能大比拼
- Android基础总结(5)——数据存储,持久化技术
- 如何突破Windows环境限制打开“命令提示符”
- 【Spark研究】Spark之工作原理
- Java中泛型使用的必要性
- “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式
- Android基础总结(4)——广播接收器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel多域名下字段验证的方法
- ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
- 简单了解如何封装自己的Python包
- python求解汉诺塔游戏
- Python第三方包PrettyTable安装及用法解析
- 如何让python的运行速度得到提升
- 在keras中对单一输入图像进行预测并返回预测结果操作
- python中数字是否为可变类型
- ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
- PHP示例演示发送邮件给某个邮箱
- PHP设计模式之观察者模式定义与用法分析
- PHP实现数组向任意位置插入,删除,替换数据操作示例
- 实例讲解Python 迭代器与生成器
- opencv 图像轮廓的实现示例
- 基于python实现可视化生成二维码工具