观察者模式
基本介绍
1、对象之间多对一依赖的一种设计方案,被依赖对象为 Subject,依赖对象为 Observer,Subject 通知 Observer 变化
角色
1.Subject:主体接口,管理 ConcreteSubject,依赖 Observer
(1)registerObserver:登记注册观察者
(2)removeObserver:移除观察者
(3)notifyObservers:通知所有的注册的用户,实现不同需求(用户获取更新数据、实施推送等)
2. Observer:观察者接口,管理 ConcreteObserver
(1)update:接收输入
3.ConcreteSubject:主体实现,实现 Subject,聚合 Observer
4.ConcreteObserver:具体观察者,实现 Observer
事项
1.优点
(1)观察者和被观察者是抽象耦合的
(2)建立一套触发机制
2.缺点
(1)如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
(2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
(3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
3.应用场景
(1)一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这些方面封装在独立的对象中使它们可以各自独立地改变和复用
(2)一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度
(3)一个对象必须通知其他对象,而并不知道这些对象是谁
(4)需要在系统中创建一个触发链,对象传递影响,可以使用观察者模式创建一种链式触发机制
JDK 中的 Observable
1.Observable:即是 Subject,又是 ConcreteSubject
2.Observable 是具体类,非接口,已经实现管理 Observer 方法,通过继承实现观察者模式
3.核心方法:注册 addObserver、移除 deleteObserver 、通知 notifyObservers
4.包含 Observer 集合:Vector<Observer>,Observer 是观察者接口,具有 update 方法
代码示例
import java.util.ArrayList;
import java.util.List;
public class Client {//客户端
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
ConcreteObserver concreteObserver = new ConcreteObserver();
concreteSubject.registerObserver(concreteObserver);
concreteSubject.update(3302);
}
}
interface Subject {//主体接口
void registerObserver(Observer observer);//注册观察者
void removeObserver(Observer observer);//移除观察者
void notifyObservers();//通知所有观察者
}
class ConcreteSubject implements Subject {//主体实现
private int data;
private List<Observer> observers;//聚合观察者
public ConcreteSubject() {
observers = new ArrayList<>();
}
public void update(int data) {//更新并推送
this.data = data;
notifyObservers();
}
@Override
public void registerObserver(Observer observer) {//注册观察者
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {//移除观察者
if (observer != null && observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObservers() {//通知所有观察者
for (Observer observer : observers) {
observer.update(data);
}
}
}
interface Observer {//观察者接口
void update(int data);
}
class ConcreteObserver implements Observer {//具体观察者
private int data;
@Override
public void update(int data) {//接收更新并展示
this.data = data;
display();
}
public void display() {
System.out.println("当前data:" + data);
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战