ngSanReader wangSanReader = new WangSanReader("王山");
ZhangsanReader zhangsanReader = new ZhangsanReader("张三");
LiSiReader liSiReader = new LiSiReader("李四");
// 王山订阅了平头哥的公众号
pingtougeAuthor.addReader(wangSanReader);
// 张三订阅了平头哥的公众号
pingtougeAuthor.addReader(zhangsanReader);
pingtougeAuthor.writeArticle("看完这篇你还不知道这些队列,我这些图白作了");
}
}
测试结果:
从测试结果中,我们可以看出张三、王山接收到了平头哥发布文章的推送通知,李四没有接收到,符合我们的预期。
接下来我们进行第二次模拟,由于平头哥最近发了不少干货,李四决定也关注平头哥的公众号,所以我们对模拟类进行了修改,修改后的模拟类如下:
public class App {
public static void main(String[] args) {
PingtougeAuthor pingtougeAuthor = new PingtougeAuthor("平头哥");
WangSanReader wangSanReader = new WangSanReader("王山");
ZhangsanReader zhangsanReader = new ZhangsanReader("张三");
LiSiReader liSiReader = new LiSiReader("李四");
// 王山订阅了平头哥的公众号
pingtougeAuthor.addReader(wangSanReader);
// 张三订阅了平头哥的公众号
pingtougeAuthor.addReader(zhangsanReader);
//
// pingtougeAuthor.writeArticle("看完这篇你还不知道这些队列,我这些图白作了");
// 李四也订阅平头哥的公众号
pingtougeAuthor.addReader(liSiReader);
pingtougeAuthor.writeArticle("实现 Java 本地缓存,该从这几点开始");
}
}
测试结果:
这次三个订阅者都接收到了平头哥发布文章的推送通知。关注了平头哥的公众号有一段时间后,张三觉得平头哥的公众号不适合自己,于是就取关了平头哥的公众号,这是我们要模拟的第三个场景,我们对模拟类进行修改,修改后的模拟类如下:
public class App {
public static void main(String[] args) {
PingtougeAuthor pingtougeAuthor = new PingtougeAuthor("平头哥");
WangSanReader wangSanReader = new WangSanReader("王山");
ZhangsanReader zhangsanReader = new ZhangsanReader("张三");
LiSiReader liSiReader = new LiSiReader("李四");
// 王山订阅了平头哥的公众号
pingtougeAuthor.addReader(wangSanReader);
// 张三订了平头哥的公众号
pingtougeAuthor.addReader(zhangsanReader);
//
// pingtougeAuthor.writeArticle("看完这篇你还不知道这些队列,我这些图白作了");
// 李四订了平头哥的公众号
pingtougeAuthor.addReader(liSiReader);
// pingtougeAuthor.writeArticle("实现 Java 本地缓存,该从这几点开始");
// 张三取关了平头哥的公众号
pingtougeAuthor.deleteReader(zhangsanReader);
pingtougeAuthor.writeArticle("实观察者模式,从微信公众号说起");
}
}
测试结果:
张三取关之后,平头哥发布的文章,他将不会再接收到推送通知。在上面公众号群发的模拟场景中,我们使用到了一种设计模式,叫做观察者模式,那今天我们就一起来简单的了解一下观察者模式。
观察者模式定义
观察者模式又叫发布-订阅模式,发布-订阅模式大家应该非常熟悉了吧,消息中间件就是发布-订阅模式,观察者模式主要也是应用在消息中间件。观察这模式定义了一种一对多的依赖关系让多个订阅者同时监听某一个对象主题,这个主题对象在状态发生变化时,会通知所有的订阅者,让他们自己更新自己。这些特点在我们的模拟场景中基本上都体现出来了,如果你对这些有疑问,可以多看我们的模拟场景。
观察者的结构
- 抽象主题(Subject)角色:抽取出了主题所需要定义的接口,比如我们的
Author
类
- 具体主题(Concrete Subject)角色:具体的主题实现者,该类必须继承抽象主题,比如我们的
PingtougeAuthor
- 抽象观察者(Observer)角色:观察者抽象类,定义观察者需要的接口,比如我们的
Reader
- 具体观察者(Concrete Observer)角色:具体的观察者,做这具体业务的类,比如我们的三个订阅者
观察者的 UML 图
观察者模式的优点
- 主题与观察者之间松耦合
- 支撑广播通信:一条消息可以通知给多个人
- 建立一条触发链:A触发B,B触发C,一条触发链,不过这个需要注意的地方很多
观察者的缺点
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
- 如果采用顺序通知,当某个观察者卡住了,其他的观察者将无法接收到通知
- 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
观察者模式差不多就这些内容,相对来说比较容易理解,另外多说一句,在JDK中已经内置了观察者模式,在java.util
下的Observable
、Observer
两个类,有兴趣的可以去了解一下。
源代码
文章不足之处,望大家多多指点,共同学习,共同进步
最后
欢迎扫码添加博主微信
posted @
2019-09-19 22:21
平头哥的技术博文 阅读(
...) 评论(
)
编辑
收藏