观察者模式详解
观察者模式是众多软件设计模式中的一种,又称发布订阅模式.被观察的对象发生了变化,观察者对象们可以第一时间收到通知, 并作出相应的处理,例如作为一家餐馆的会员,若餐馆出了新品那么会第一时间通知到各个会员,不是会员的路人则不会收到通知
再看一下类图:
FoodSubject sub = new FoodSubject();
new LisaObserver(sub);
Observer tom = new TomObserver(sub);
System.out.println("----菜品发布------");
Thread.sleep(1000);
sub.onChange("剁椒鱼头", "80.00", "热菜");
System.out.println("--- tom竟然取消关注 ---");
sub.remove(tom);
System.out.println("----又有菜品发布哦------");
Thread.sleep(1000);
sub.onChange("外婆菜炒蛋", "18.00", "热菜");
----菜品发布------
我是lisa, 食物:剁椒鱼头,价格:80.00,菜品类型:热菜
我是tom, 食物:剁椒鱼头,价格:80.00,菜品类型:热菜
--- tom竟然取消关注 ---
----又有菜品发布哦------
我是lisa, 食物:外婆菜炒蛋,价格:18.00,菜品类型:热菜
JDK已经帮我们实现了观察者模式,Observable相当于Subject,Observer同上自定义的Observer,只有一个方法: //①.被观察者对象,②.参数 void update(Observable o, Object arg);
Observable是一个class而非一个接口 提供addObserver(Observer o) deleteObserver(Observer o)
notifyObservers() notifyObservers(Object arg) //必须在调用notifyObservers方法前先调用一次 //因为只有为true时才会通知观察者 void setChanged()
public class News extends Observable{
private String subject;
private String content;
private Date date;
public News() {}
public void onChange(String subject, String content){
this.subject = subject;
this.content = content;
this.date = new Date();
setChanged();
notifyObservers();
}
public String getSubject() {
return subject;
}
public String getContent() {
return content;
}
public Date getDate() {
return date;
}
}
public class Person implements Observer, IShow {
private News news;
private String name;
public Person(Observable subject, String name) {
subject.addObserver(this);
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if (o == null || !(o instanceof News)) {
return;
}
news = (News) o;
show();
}
@Override
public void show() {
System.out.println("我是" + name + ",我阅读了:n 主题:" + news.getSubject() + "n内容:"
+ news.getContent()
+ "n发布时间:" + news.getDate());
}
如果观察者对象不需要所有的参数
public class Lisa implements Observer, IShow{
private News news;
public Lisa(Observable subject) {
subject.addObserver(this);
}
@Override
public void show() {
System.out.println("我是lisa,我阅读了最新的新闻:n 主题:" + news.getSubject() + ",内容:"
+ news.getContent());
}
@Override
public void update(Observable o, Object arg) {
if(o == null || !(o instanceof News)){
return;
}
news = (News)o;
show();
}
public interface IShow {
void show();
}
//测试
News news = new News();
System.out.println("----- 新闻资讯 -------");
String subject = "生态养海 拥海而兴";
String content = "进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。";
new Tom(news);
new Person(news,"any");
new Person(news,"tony");
new Person(news,"lexa");
Lisa lisa = new Lisa(news);
news.onChange(subject, content);
Thread.sleep(1000);
System.out.println("lisa不感兴趣,取消关住.");
news.deleteObserver(lisa);
Thread.sleep(1000);
System.out.println("----- 又发布了最新资讯 --------");
subject = "特朗普赦免感恩节火鸡:它将拥有一个非常光明的未来";
content = "美国总统特朗普21日遵照白宫的节日传统,在感恩节前赦免了两只火鸡。";
news.onChange(subject, content);
----- 新闻资讯 -------
我是lisa,我阅读了最新的新闻:
主题:生态养海 拥海而兴,内容:进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。
我是lexa,我阅读了:
主题:生态养海 拥海而兴
内容:进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。
发布时间:Thu Nov 23 16:53:16 CST 2017
我是tony,我阅读了:
主题:生态养海 拥海而兴
内容:进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。
发布时间:Thu Nov 23 16:53:16 CST 2017
我是any,我阅读了:
主题:生态养海 拥海而兴
内容:进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。
发布时间:Thu Nov 23 16:53:16 CST 2017
我是tom,我阅读了:
主题:生态养海 拥海而兴,内容:进入11月下旬,海风吹在脸上已有些刺骨,但温州洞头区东屏街道东岙村,渔家乐的生意依旧红火。,发布时间:Thu Nov 23 16:53:16 CST 2017
lisa不感兴趣,取消关住.
----- 又发布了最新资讯 --------
我是lexa,我阅读了:
主题:特朗普赦免感恩节火鸡:它将拥有一个非常光明的未来
内容:美国总统特朗普21日遵照白宫的节日传统,在感恩节前赦免了两只火鸡。
发布时间:Thu Nov 23 16:53:18 CST 2017
我是tony,我阅读了:
主题:特朗普赦免感恩节火鸡:它将拥有一个非常光明的未来
内容:美国总统特朗普21日遵照白宫的节日传统,在感恩节前赦免了两只火鸡。
发布时间:Thu Nov 23 16:53:18 CST 2017
我是any,我阅读了:
主题:特朗普赦免感恩节火鸡:它将拥有一个非常光明的未来
内容:美国总统特朗普21日遵照白宫的节日传统,在感恩节前赦免了两只火鸡。
发布时间:Thu Nov 23 16:53:18 CST 2017
我是tom,我阅读了:
主题:特朗普赦免感恩节火鸡:它将拥有一个非常光明的未来,内容:美国总统特朗普21日遵照白宫的节日传统,在感恩节前赦免了两只火鸡。,发布时间:Thu Nov 23 16:53:18 CST 2017
因为Observable是一个“类”,你必须设计一个类继承它。如果某类想同时 具有Observable类和另一个超类的行为,就会陷入两难,毕竟Java不支持多重继承。 这限制了Observable的复用潜力. 再者,因为没有Observable接口,所以无法建立自己的实现和Java内置的 Observer搭配使用,也无法将java.util的实现换成另一套做法的实现(比方说, 如果你能够扩展java.util.Observable,那么Observable“可能”可以符合你的需求。 否则,你可能需要像本章开头的做法那样自己实现这一整套观察者模式。 而且setChanged()方法被保护起来了(被定义成protected)。这意味着:除非你继承自Observable,否则你无法创建Observable实例并组合到你自己的对象中来。
- 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 数组属性和方法
- leetcode树之二叉搜索树的最近公共祖先
- 【技术创作101训练营】技术角 | 在CentOS 8上使用Nginx 1.18: 基本配置
- Java诊断应用之Arthas实战(技术创作101训练营)
- 突击并发编程JUC系列-数组类型AtomicLongArray
- 个人量化投资体系搭建(一)
- 服务端的 WebAssembly 与 Rust 入门篇
- pImpl
- Flask+requests发起页面请求示例
- 【技术创作101训练营】Git 如何成功配置SSH key连接多个代码平台?
- 深入浅出iOS内存管理-技术创作101训练营
- 聊聊原型 Prototype | 技术创作101训练营
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
- PUMA560机器人工具箱运动控制A:路径规划-运动学
- Android 3分钟带你入门开发测试
- Spring Boot 知识清单(一)SpringApplication