Java内功修炼系列一观察者模式
观察者模式又称发布-订阅模式,就是观察者通过订阅被观察者,或关注被观察者,从而实时更新观察者的信息。比如我们玩微博的时候,如果关注了一些博主,那么当博主发动态时,在首页微博列表中就会自动更新这些博主发的微博,而不需要我们自己去获取。其中我们(粉丝)就是观察者,博主是被观察者,关注就相当于订阅,订阅之后被观察者的更新动态都会通知给观察者,从而更细观察者自己的关注信息。
下面以微博为例,假设有三个程序员分别是张三、李四、王麻子,还有一个名为Java大本营的一个博主,这个博主每天会更新一些java知识的博文,在关注之前这三个程序员必须每次主动进入这个博主的主页去查看有哪些更新,为了不这么麻烦,他们决定关注这个博主,订阅他更新的文章,这样他们只要在自己的微博关注中下拉刷新一下,就能看到博主所有的动态。
第一步:创建一个观察者接口
/*
* 定义一个观察者接口
*/
public interface Observer {
//更新消息
public void update(String message,String bloggerName);
}
第二步:定义一个微博用户类,做为观察者实现上面的接口
/*
* 定义一个微博用户类,实现观察者接口
*/
public class WeiboUser implements Observer {
private String nickName;// 用户昵称 public WeiboUser(String nickName) {
this.nickName = nickName;
} /*
* 微博用户刷新自己的关注列表
*/
public void update(String message, String bloggerName) {
System.out.println("用户" + nickName + "收到了博主" + bloggerName + "更新的微博:" + message);
}
}
第三步:定义一个被观察者接口,用来添加、删除、通知观察者
/*
* 定义一个被观察者接口:接口中定义增加观察者、删除观察者和通知观察者的接口
*/
public interface Observable {
// 增加观察者
public void addObserver(Observer observe); // 删除观察者
public void deleteObserver(Observer observer); // 通知观察者
public void notifyObserver(); }
第四步:定义一个博主类,作为被观察者实现上面的接口
/*
* 定义一个博主类:实现被观察者接口
*/
public class Blogger implements Observable {
public String name;// 博主名称
public String message;// 微博信息
public List<Observer> fansList = new ArrayList<Observer>();// 粉丝列表 public Blogger(String name) {
this.name = name;
} // 增加一个粉丝
public void addObserver(Observer observer) {
fansList.add(observer);
} // 删除一个粉丝
public void deleteObserver(Observer observer) {
if (!fansList.isEmpty()) {
fansList.remove(observer);
}
} // 通知粉丝更新的消息
public void notifyObserver() {
for (Observer observer : fansList) {
observer.update(message, name);
}
} // 博主更新微博
public void updateWeibo(String message) {
this.message = message;
System.out.println("博主" + name + "更新了一条微博,内容为:" + message);
} }
第五步:用户开始玩微博
/*
* 实现玩微博
*/
public class PlayWeibo {
public static void main(String[] args) {
// 三个程序员用户
Observer zhangsan = new WeiboUser("张三");
Observer lisi = new WeiboUser("李四");
Observer wangmazi = new WeiboUser("王麻子");
// Java大本营博主
Blogger javaBlogger = new Blogger("Java大本营"); //让三个程序员关注博主
javaBlogger.addObserver(zhangsan);
javaBlogger.addObserver(lisi);
javaBlogger.addObserver(wangmazi); //Java大本营更新微博
javaBlogger.updateWeibo("Java是世界上最好的语言"); //Java大本营通知所有粉丝
javaBlogger.notifyObserver(); //粉丝张三对Java大本营取关
javaBlogger.deleteObserver(zhangsan); //Java大本营又更新了一条消息
javaBlogger.updateWeibo("Hello World!"); //Java大本营再次通知所有粉丝
javaBlogger.notifyObserver(); }
}
第六步:分析结果
博主Java大本营更新了一条微博,内容为:Java是世界上最好的语言
用户张三收到了博主Java大本营更新的微博:Java是世界上最好的语言
用户李四收到了博主Java大本营更新的微博:Java是世界上最好的语言
用户王麻子收到了博主Java大本营更新的微博:Java是世界上最好的语言
博主Java大本营更新了一条微博,内容为:Hello World!
用户李四收到了博主Java大本营更新的微博:Hello World!
用户王麻子收到了博主Java大本营更新的微博:Hello World!
从上述结果可以看出,当三个程序员用户关注了博主之后,每当博主发布了微博,他们三个都能收到;而当张三取关博主之后,博主再次更新的微博他就看不到了,所以说只有用户(观察者)关注(订阅)了博主(被观察者),才能及时看到博主更新的内容,这就是观察者模式,或发布-订阅模式。
Java内功修炼系列一观察者模式的更多相关文章
- Java内功修炼系列一反射
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制 ...
- Java内功修炼系列一拦截器
在动态代理中,我们知道在代理类中,执行真实对象的方法前后可以增加一些其他的逻辑,这些逻辑并不是真实对象能够实现的方法,比如一个租房的用户希望租一套公寓,但是中介所代理的这个房东并没有可以出租的公寓,那 ...
- Java内功修炼系列一代理模式
代理模式是JAVA设计模式之一,网上设计模式相关的博文铺天盖地,参考它们有助于自己理解,但是所谓“尽信书不如无书”,在参考的同时也要思考其正确性,写博客也是为了记录自己理解知识点的思路历程和心路历程, ...
- Java内功修炼系列一工厂模式
工厂模式是一种创建型模式,它提供了一种新的创建对象的方式,一般情况下我们都习惯用new关键字直接创建对象.有时候会遇到这种情况,我们需要根据具体的场景选择创建什么类型的对象,可能有多种类型都能选择,但 ...
- Java内功修炼系列一责任链模式
在上一节的拦截器中提到,程序的设计者一般会用拦截器替替代动态代理,将动态代理的逻辑隐藏起来,而把拦截器接口提供给开发者,使开发者不需要关系动态代理的具体实现过程,但是有时候需要多个拦截器,而且拦截器之 ...
- Java 内功修炼 之 数据结构与算法(一)
一.基本认识 1.数据结构与算法的关系? (1)数据结构(data structure): 数据结构指的是 数据与数据 之间的结构关系.比如:数组.队列.哈希.树 等结构. (2)算法: 算法指的是 ...
- Java 内功修炼 之 数据结构与算法(二)
一.二叉树补充.多叉树 1.二叉树(非递归实现遍历) (1)前提 前面一篇介绍了 二叉树.顺序二叉树.线索二叉树.哈夫曼树等树结构. 可参考:https://www.cnblogs.com/l-y-h ...
- Hadoop内功修炼
IT十八掌<大数据内功修炼系列课程>强势推出!由实战派名师徐培成亲自操刀,学完做不了大数据我们负全责!2015.12.21前,优惠价:4999(名额已不多!)2015.12.31前,优惠价 ...
- Java设计模式(20)观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
随机推荐
- VS2010-MFC(对话框:一般属性页对话框的创建及显示)
转自:http://www.jizhuomi.com/software/169.html 属性页对话框包括向导对话框和一般属性页对话框两类,上一节演示了如何创建并显示向导对话框,本节将继续介绍一般属性 ...
- CCPC 2019 网络赛 1002 array (权值线段树)
HDU 6703 array 题意: 给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同. 有两种 ...
- centos7 将home目录空间扩容到根目录
[root@localhost ~]# umount /home/ [root@localhost ~]# lvremove /dev/mapper/centos-home Do you really ...
- P1020 导弹拦截 /// DP Dilworth定理 LIS、LDS优化
题目大意: https://www.luogu.org/problemnew/show/P1020 Dliworth有两个互相对偶的定理:U的链划分使用的最少集合数,等于它的最大反链长度.(1)U的反 ...
- 2019-7-1-Roslyn-让编译时候-Message-内容默认输出
title author date CreateTime categories Roslyn 让编译时候 Message 内容默认输出 lindexi 2019-07-01 14:16:59 +080 ...
- leetcode-买卖股票的最佳时机④*
题目描述: 方法一: class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: if len(prices) ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- 基于SpringBoot的开源微信开发平台,Jeewx-Boot 1.0 版本发布
项目介绍 JeewxBoot 是一款基于SpringBoot的免费微信开发平台.支持微信公众号.小程序官网.微信抽奖活动. Jeewx-Boot实现了微信公众号管理.小程序CMS.微信抽奖活动等基础功 ...
- Docker系列(十):Kubernetes集群入门
kubenetes安装 官网:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/getting-started- guide ...
- <meta>标记
<meta>的主要作用: 是提供网页的元素信息 属性: http-equiv: 功能: 默认http协议文件头信息,当信息从服务器端传到客户端时,让浏览器正确的是显示, http_equi ...