观察者模式
时间:2019-09-03
本文章向大家介绍观察者模式,主要包括观察者模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
第一、观察者模式定义
观察者模式(ObServer Pattern)定义对象之间的一对多的依赖,让多个观察者对象同时监听一个对象,当主体对象发生变化时,它的所有依赖者(观察者)
都会收到通知并更新,其实就是发布定义模式,发布者发布消息,订阅者获取消息,订阅了就能接收到消息,没有订阅就接收不到消息。
第二、观察者模式应用场景
Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册分布式配置中心
第三、观察者模式原理类图
抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,
可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态
第四、观察者模式简单实现
/**
* 抽象主题
*/
public interface AbstractSubject {
/**
* 添加ObServer 添加订阅者
* @param obServer
*/
public void addObServer(ObServer obServer);
/**
* 移除ObServer
* @param obServer
*/
public void removeObServer(ObServer obServer);
/**
* 通知所有的ObServer
* @param message
*/
public void notifyObServerAll(String message);
/**
* 设置更新内容
* @param message
*/
public void setNtifyMessage(String message);
}
/**
* 抽象观察者
*
*/
public interface ObServer {
//更新内容
public void update(String message);
}
/**
* 具体观察者
*/
public class UserObServer implements ObServer {
private String name;
public UserObServer(String name){
this.name = name;
}
@Override
public void update(String message) {
this.name = name;
this.read(message);
}
/**
* 读取消息
* @param message
*/
public void read(String message) {
System.out.println(name + ",老师收到推送消息:" + message);
}
}
/**
* 抽象主题
*/
public class WeChatSubject implements AbstractSubject {
private List<ObServer> obServerList = new ArrayList<ObServer>();
private String message;
@Override
public void addObServer(ObServer obServer) {
obServerList.add(obServer);
}
@Override
public void removeObServer(ObServer obServer) {
obServerList.remove(obServer);
}
@Override
public void notifyObServerAll(String message) {
for (ObServer server : obServerList) {
server.update(message);
}
}
@Override
public void setNtifyMessage(String message) {
this.message = message;
System.out.println("微信公众号设置message:" + message);
//通知所有的订阅者接收消息
notifyObServerAll(message);
}
}
/**
* 测试类
*/
public class Test001 {
public static void main(String[] args) {
//注册主题
AbstractSubject weChatSubject = new WeChatSubject();
weChatSubject.addObServer(new UserObServer("小强"));
weChatSubject.addObServer(new UserObServer("小张"));
//发送消息
weChatSubject.setNtifyMessage("今天下午到我办公室来一趟!!!有重大的事情安排");
}
}
第五、JDK自带观察实现消息发送
(1). Observable类追踪所有的观察者,并通知他们。
(2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。
/**
* JDK提供的一种观察者的实现方式,被观察者
* 自定义一个主题
*/
public class MessageObServable extends Observable {
private String name;
MessageObServable(String name){
this.name = name;
}
public void publishMessage(Message message){
System.out.println(message.getName() + "在" + this.name + "上提交了一个问题。");
//改变数据
setChanged();
//通知所有的观察者
notifyObservers(message);
}
}
/**
* 信息实体
*/
public class Message {
private String name;
private String content;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
/**
*自定义观察者
*/
public class Teacher implements Observer {
private String name;
public Teacher(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
MessageObServable userObServer = (MessageObServable) o;
Message message = (Message) arg;
System.out.println(this.name+"向"+message.getName()+"描述了:"+message.getContent());
}
}
/**
* 测试类
*/
public class Test001 {
public static void main(String[] args) {
MessageObServable messageObServable = new MessageObServable("张三");
messageObServable.addObserver(new Teacher("李四"));
messageObServable.addObserver(new Teacher("王五"));
Message message = new Message();
message.setName("王五");
message.setContent("今天迟到了!!!!");
messageObServable.publishMessage(message);
}
}
原文地址:https://www.cnblogs.com/cxyyh/p/11450823.html
- 简单易学的机器学习算法——EM算法
- 备库跳归档恢复的有趣案例(r9笔记第19天)
- Java基础-day02-代码题
- 优化算法——拟牛顿法之L-BFGS算法
- 一次性能突发情况的紧急修复(r9笔记第18天)
- Java基础-day02-基础题
- 简单易学的机器学习算法——AdaBoost
- 用脚本来讲一个技术生活的故事 (r9笔记第32天)
- 优化算法——拟牛顿法之BFGS算法
- 对于tnsping的连接超时的功能补充(二)(r9笔记第22天)
- 用深度学习每次得到的结果都不一样,怎么办?
- 优化算法——拟牛顿法之DFP算法
- python SVM 案例,sklearn.svm.SVC 参数说明
- 利用Theano理解深度学习——Auto Encoder
- 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 数组属性和方法