观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

意图
结构
class Subject{
List<Observer> observerList = new ArrayList<>();
void f(){
//do sth...
for(Observer o:observerList){
//调用相关方法
o.doSthElse();
}
}

代码示例
package observer;
public interface Observer {
void update();
}
package observer;
import java.util.LinkedList;
import java.util.List; public abstract class Subject { List<Observer> observerList; Subject() {
observerList = new LinkedList<>();
} void attach(Observer o) {
observerList.add(o);
} void dettach(Observer o) {
observerList.remove(o);
} void notifyObservers() {
for (Observer o : observerList) {
o.update();
}
}
}
package observer;
public class ConcreteSubject extends Subject {
public void action() {
System.out.println("下雨了");
super.notifyObservers();
}
}
package observer;
public class ConcreateObserver implements Observer {
@Override
public void update() {
System.out.println("那我收衣服了");
}
}
package observer;
public class Test {
public static void main(String[] args) {
Observer o1 = new ConcreateObserver();
ConcreteSubject subject = new ConcreteSubject();
subject.attach(o1);
subject.action();
}
}

package observer;
public class ConcreteObserver1 implements Observer {
@Override
public void update() {
System.out.println("那我得把窗户关上");
}
}

Java的观察者模式
是一个interface,定义了一个update方法
void update(Observable o, Object arg);
接受两个参数,一个是被观察对象,一个是参数
| addObserver(Observer o) | 添加指定观察者 |
| deleteObserver(Observer o) | 删除指定观察者 |
| deleteObservers() | 删除所有观察者 |
| countObservers | 返回观察者个数 |
|
notifyObservers()
notifyObservers(Object arg)
|
通知所有观察者
一个无参,一个有参
参数传递给Observer的update
|
- 使用Vector保存观察者,提供了添加、删除、删除全部的方法,并且可以返回观察者的个数。
- 如果的确发生变动,将会通知所有的观察者
package observer.java;
import java.util.Observable;
public class Subject extends Observable {
public void changeState() {
System.out.println("下雨了........");
setChanged();
notifyObservers();
}
}
package observer.java;
import java.util.Observable;
import java.util.Observer;
public class Watcher1 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("被观察者:" + o + " ,参数 " + arg + " ,观察者1");
}
}
package observer.java;
import java.util.Observable;
import java.util.Observer;
public class Watcher2 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("被观察者:" + o + " ,参数 " + arg + " ,观察者2");
}
}

与中介者模式区别
总结
观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)的更多相关文章
- 观察者模式 vs 发布-订阅模式
我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回 ...
- js之观察者模式和发布订阅模式区别
观察者模式(Observer) 观察者模式指的是一个对象(Subject)维持一系列依赖于它的对象(Observer),当有关状态发生变更时 Subject 对象则通知一系列 Observer 对象进 ...
- 观察者模式Vs发布订阅模式
1)观察者模式 观察者模式通俗的讲就是我们平事件调用(click/change等等) 大家先看这个图片.我们被观察者Subject(监听某个事件)发生改变时,观察者Observer监听到没改变做出调整 ...
- java设计模式之-观察者模式(发布-订阅模式)
1.观察者模式定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己. 2.观察者模式结构 ...
- C#设计模式--观察者模式(发布-订阅模式)
0.C#设计模式--简单工厂模式 1.C#设计模式--工厂方法模式 2.C#设计模式--抽象工厂模式 3.C#设计模式--单例模式 4.C#设计模式--建造者模式 5.C#设计模式--原型模式 6.C ...
- SpringBoot事件监听机制及观察者模式/发布订阅模式
目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...
- 浅谈vue响应式原理及发布订阅模式和观察者模式
一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...
- C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- javascript中的发布订阅模式与观察者模式
这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一. 设计模式的背景 设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学. 设计模式的定义是 ...
随机推荐
- ES踩坑笔记
现在开始在业务上使用ES,记录一些踩坑经历,做点笔记. 2018-11-13 source不返回问题 使用了角色校验,客户端插入成功之后获取数据没有source,和查询参数无关. 检查mapping, ...
- redis基本类型以及优点特性
1.什么是redis? redis是一个基于内存的高性能key-value数据库 2.redis基本数据类型及应用场景 支持多种数据类型: string(字符串) String数据结构是简单的k ...
- JPA中自定义的插入、更新、删除方法为什么要添加@Modifying注解和@Transactional注解?
前几天,有个同事在使用JPA的自定义SQL方法时,程序一直报异常,捣鼓了半天也没能解决,咨询我的时候,我看了一眼他的程序,差不多是这个样子的: @Repository public interface ...
- 从git仓库导入idea的gradle项目无法添加依赖包问题
引言 之前将项目导入到git仓库,后来同事从git仓库将项目导入到本地,发现无法导入依赖包. 解决方法 这个勾idea是默认勾上的,意思是idea将默认使用本地离线工作模式,使用的是本地仓库,每次依赖 ...
- Thymeleaf【快速入门】
前言:突然发现自己给自己埋了一个大坑,毕设好难..每一个小点拎出来都能当一个小题目(手动摆手..),没办法自己选的含着泪也要把坑填完..先一点一点把需要补充的知识学完吧.. Thymeleaf介绍 稍 ...
- Netty源码—七、内存释放
Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用 ...
- 用markdown + html写一封简历
0. 前言 1. 阶段1 - 确定需要几个模块 2. 阶段2 - 使用纯文字填充简历 3. 阶段3 - 预留空格 4. 阶段4 - 文章垂直方向的调整 5. 阶段5 - 居中对齐 6. 阶段6 - 加 ...
- 在阿里云服务器windows server2012r iis上部署.net网站
先说一堆废话:之前在阿里云上租了一个服务器,也配置了相关的环境,然后准备把自己手上的一个小网站挂上去,就按照我的上篇博客记载的方法把发布好的网站发布到服务器的iis上,结果发布之后死活访问不了,始终显 ...
- idea配置tomcat运行按钮置灰,下拉没有自定义的tomcat选项
一.问题 下拉没有自定义tomcat的选项 run按钮置灰,点不了 二.解决 添加自己的tomcat时,一定要点加号,不要用那个默认的.
- mpvue小程序开发之 集成第三方UI框架Vant Weapp UI
集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...