设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)相关的知识,希望对你有一定的参考价值。
设计模式 行为型模式 – 观察者模式 JDK中提供的实现:Observabie类
1. 观察者模式
1.1 引入
分析:
1.2 定义
1.3 结构
1.3.1 典型的抽象目标类代码
1.3.2 典型的具体目标类代码
1.3.3 典型的抽象观察者代码
1.3.4 典型的具体观察者代码
1.3.5 典型的客户端代码片段
1.3.6 补充:说明
1.4 【例】微信公众号
需求分析:
在使用微信公众号时,大家都会有这样的体验,当你关注的公众号中有新内容更新的话,它就会推送给关注公众号的微信用户端。我们使用观察者模式来模拟这样的场景,微信用户就是观察者,微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号。
类图如下:
代码实现:
Observer.java
package com.tian.observer;
/**
* @version v1.0
* @ClassName: Observer
* @Description: 抽象观察者类
*/
public interface Observer {
void update(String message);
}
WeiXinUser.java
package com.tian.observer;
/**
* @version v1.0
* @ClassName: WeiXinUser
* @Description: 具体的观察者角色类
*/
public class WeiXinUser implements Observer {
private String name;
public WeiXinUser(String name) {
this.name = name;
}
public void update(String message) {
System.out.println(name + "-" + message);
}
}
Subject.java
package com.tian.observer;
/**
* @version v1.0
* @ClassName: Subject
* @Description: 抽象主题角色类
*/
public interface Subject {
//添加订阅者(添加观察者对象)
void attach(Observer observer);
//删除订阅者
void detach(Observer observer);
//通知订阅者更新消息
void notify(String message);
}
Client.java
package com.tian.observer;
/**
* @version v1.0
* @ClassName: Client
* @Description: 客户端类:测试类
*/
public class Client {
public static void main(String[] args) {
//1,创建公众号对象
SubscriptionSubject subject = new SubscriptionSubject();
//2,订阅公众号
subject.attach(new WeiXinUser("用户一"));
subject.attach(new WeiXinUser("用户二"));
subject.attach(new WeiXinUser("用户三"));
//3,公众号更新,发出消息给订阅者(观察者对象)
subject.notify("不给糖果就捣乱额!");
}
}
1.4.1 运行结果
1.5 优缺点分析 适用场景
1.5.1 优点
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
- 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】
1.5.2 缺点
- 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时
- 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩
1.5.3 适用场景
- 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。
以上是关于设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)的主要内容,如果未能解决你的问题,请参考以下文章