观察者模式
时间:2019-10-09
本文章向大家介绍观察者模式,主要包括观察者模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
观察者模式
标签(空格分隔): 设计模式
观察者模式: 当对象之间存在一对多的关系的时候, 则使用观察者模式. 比如当一个对象呗修改的时候, 则会自动通知他的依赖对象, 观察者模式属于行为模式
优点
观察者模式实现了动态联动
观察者模式实现了广播通信
缺点
如一个主题被大量观察者观察, 则通知所有的观察者的代价较高.
如果某些观察者的相应方法被阻塞, 整个通知过程也会被阻塞, 其他观察者不能及时被通知.
public interface Observer {
void update(String info);
}
public class StudentObserver implements Observer {
private String name;
public StudentObserver(String name) {
this.name = name;
}
@Override
public void update(String info) {
System.out.println(name+"收到消息"+info);
}
}
import java.util.ArrayList;
import java.util.List;
public interface Subject{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String msg);
}
import java.util.ArrayList;
import java.util.List;
public class TeacherSubject implements Subject{
//用来存放和记录观察者
private List<Observer> observers=new ArrayList<Observer>();
@Override
public void registerObserver(Observer obj) { //增加观察者
observers.add(obj);
}
@Override
public void removeObserver(Observer obj) { //删除观察者
int i = observers.indexOf(obj);
if( i >= 0 )
observers.remove(obj);
}
@Override
public void notifyObservers(String msg) { //通知消息
for(Observer observer : observers) {
observer.update(msg);
}
}
}
public class Test {
public static void main(String[] args){
TeacherSubject teacher = new TeacherSubject();
StudentObserver studentObserver1 = new StudentObserver("鸣人");
StudentObserver studentObserver2 = new StudentObserver("佐助");
teacher.registerObserver(studentObserver1);
teacher.registerObserver(studentObserver2);
teacher.notifyObservers("发作业啦");
}
}
原文地址:https://www.cnblogs.com/A-FM/p/11644263.html
- 摸金Redis漏洞
- 机器人越来越像人,你会担心你的工作被人工智能取代吗?
- 一句代码实现批量数据绑定[上篇]
- 机器学习-从高频号码中预测出快递送餐与广告骚扰
- MS Windows 下基于Atom的LaTeX编译环境的配置
- WCF中的Binding模型之一: Binding模型简介
- WCF中的Binding模型之一: Binding模型简介
- 2017最火的五篇深度学习论文 总有一篇适合你
- SplashScreenSource的妙用
- SplashScreenSource的妙用
- SplashScreenSource的妙用
- Nodejs学习笔记(十七)--- 浮点运算decimal.js
- AI时代让自己幸福更是一种能力
- 持续不断地推荐儿童不宜视频背后,YouTube是这样训练AI的
- 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 数组属性和方法
- Vue3 为何使用 Proxy 实现数据监听
- vivo 悟空活动中台 - H5 活动加载优化
- PostgreSQL常用命令
- 实用!一键生成数据库文档,堪称数据库界的Swagger
- 布隆过滤器原理
- 缓存穿透了怎么办?
- Stata | 生成等差数列的几种方式
- 一致性算法 - Raft协议流程
- 5.16.2-如何制作ElasticSearch的Parcel和csd
- bash显示git分支
- 0793-5.16.2-如何迁移单个Zookeeper实例
- 来了来了!Docker安装及运行原理
- 学习 | Node.js 之定时任务
- HTML标记语言学习笔记
- 明知 | TypeScript 结合 egg.js 基本使用