设计模式之观察者模式
观察者模式
-
观察者模式结构图
-
示例代码
// 抽象主题
public abstract class Subject {
protected List<Observer> observers = new ArrayList<>();
protected Event event;
public boolean attach(Observer observer){
return !observers.contains(observer) && observers.add(observer);
}
public boolean detach(Observer observer){
return observers.contains(observer) && observers.remove(observer);
}
public void setEvent(Event event){
this.event = event;
}
public abstract void notifies();
}
// 具体主题
public class ConcreteSubject extends Subject{
@Override
public void notifies() {
observers.forEach(a -> a.update(event));
}
}
// 事件
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Event {
private Object source;
private Observer target;
private String trigger;
private Long time;
}
// 抽象观察者
public interface Observer {
void update(Event event);
}
// 具体观察者A
public class ConcreteObserverA implements Observer{
@Override
public void update(Event event) {
System.out.println("具体观察者A接受到观察事件:" + event.getTrigger());
}
}
// 具体观察者B
public class ConcreteObserverB implements Observer{
@Override
public void update(Event event) {
System.out.println("具体观察者B接受到观察事件:" + event.getTrigger());
}
}
// 测试
public class ObserverTest {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Event event = new Event();
event.setSource(subject);
event.setTime(System.currentTimeMillis());
event.setTrigger("被观察对象发生了变化......");
subject.setEvent(event);
subject.attach(new ConcreteObserverA());
subject.attach(new ConcreteObserverB());
subject.notifies();
}
}
-
总结:
优点:观察者与被观察者是松耦合的,符合依赖倒置原则,且实现了一对多的通信机制;
缺点:如果观察者数量过多,则耗时较长;且事件通知呈线性关系,若其中一个观察者卡壳,则影响后续观察者接受事件;若观察者与被观察者存在循环依赖,则可能造成两者之间的循环调用,导致系统崩溃.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探