赞
踩
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。
是一种行为型模式。因为叫发布-订阅模式更容易理解,所以下面说明时大多情况会使用发布-订阅这个名称。
目录
1、观察者模式定义了一种一对多的依赖关系,让多个观察者(订阅者)对象同时监听某一个主题(发布者)对象。这个主题(发布者)对象在状态发生变化时,会通知所有观察者(订阅者)对象,使它们能够自动更新自己。
(注:关于发布者何时给订阅者通知更新,这个需要结合实际情况来考虑)
- 发布者(目标主题):发布者的抽象类或接口 + 发布者类
- 订阅者(观察者):订阅者的抽象类或接口 + 订阅者类
- 一个抽象模型有两个方面,其中一个方面依赖另一个方面。可以将它们封装独立出来
- 对一个对象的改变需要同时改变其他对象
- 一个对象必须通知其他对象,而且其他对象并不是固定不变的
假设 客户端 要让 发布者 设置自己的状态为hello,再然后通知 张三 和 李四 这两个 订阅者 。例子简单就不再详细分析了。你可以把这当做一个模板,然后灵活使用:
订阅者的抽象类:
- abstract class Subscriber {
- public abstract void update();//接收发布者的消息
- }
发布者的抽象类:
- abstract class Publisher {
- private List<Subscriber> list; //链表
-
- public Publisher() {//初始化
- this.list = new LinkedList<>();
- }
-
- public void attach(Subscriber subscriber) { //增加订阅者
- list.add(subscriber);
- }
-
- public void detach(Subscriber subscriber) {//删除订阅者
- list.remove(subscriber);
- }
-
- public void notifySubscriber() {//通知订阅者
- for (Subscriber subscriber : list) {
- subscriber.update();
- }
- }
-
- private String publisherState;//发布者状态
-
- public String getPublisherState() {//得到发布者状态
- return this.publisherState;
- }
-
- public void setPublisherState(String publisherState) {//设置发布者状态
- this.publisherState = publisherState;
- }
- }
具体的发布者A:
- public class ConcretePublisherA extends Publisher{
- //发布者的其它方法
- }
具体的订阅者1:
- public class ConcreteSubscriber1 extends Subscriber {
- private String name;//订阅者名称
- private Publisher publisher;//发布者
-
- public ConcreteSubscriber1(String name, Publisher publisher) {//初始化
- this.name = name;
- this.publisher = publisher;
- }
-
- @Override
- public void update() {//接收发布者的消息
- System.out.println("订阅者是:" + this.name + ",发布者的状态为:" + this.publisher.getPublisherState());
- }
- }
主程序(发起请求的类):
- public class Main {
- public static void main(String[] args) {
- Publisher publisher = new ConcretePublisherA();
- Subscriber subscriber1 = new ConcreteSubscriber1("张三", publisher);
- Subscriber subscriber2 = new ConcreteSubscriber1("李四", publisher);
- publisher.attach(subscriber1);
- publisher.attach(subscriber2);
- publisher.setPublisherState("hello!");
- //通知订阅者
- publisher.notifySubscriber();
- }
- }
这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。