观察者模式
定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。类似发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息
四种角色:抽象被观察者角色 抽象观察者角色 具体被观察者角色 具体观察者角色
小Demo走一波
1、定义Observer
public interface Observer { public void notify(String info); }
2、定义Observer实现
public class ObserverImpl implements Observer{ private SubjectImpl subject; private String observerName; //注册感兴趣的subject public ObserverImpl(SubjectImpl subject, String observerName) { this.subject = subject; this.observerName = observerName; subject.register(this); } //打印接收到消息 @Override public void notify(String info) { System.out.println("observer " + this.observerName + " receive data: " + info); } }
3、定义Subject
public interface Subject { /** * register observer */ public void register(Observer obj); /** * remove observer */ public void remove(Observer obj); public void notifyIfObserverChange(); }
4、subject实现
public class SubjectImpl implements Subject{ private ArrayList<Observer> observerList = new ArrayList<Observer>(); private String info; @Override public void register(Observer obj) { observerList.add(obj); } @Override public void remove(Observer obj) { int i = observerList.indexOf(obj); if(i > 0) observerList.remove(i); } @Override public void notifyIfObserverChange() { for (int i = 0, len = observerList.size(); i < len; i++) { Observer instance = (Observer)observerList.get(i); instance.notify(info); } } public void setWork(String _info) { this.info = _info; System.out.println("send data: " + info); this.notifyIfObserverChange(); } }
5、测试
public class Main { public static void main(String[] args) { SubjectImpl sub = new SubjectImpl(); new ObserverImpl(sub, "t1"); new ObserverImpl(sub, "t2"); new ObserverImpl(sub, "t3"); sub.setWork("123"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?