设计模式——观察者模式(ObserverPattern)
2013-11-30 17:13 雪夜&流星 阅读(233) 评论(0) 编辑 收藏 举报观察者模式(ObserverPattern):观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一个中一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
UML图:
Subject:
package com.cnblog.clarck; import java.util.ArrayList; import java.util.List; /** * 主题/抽象通知者 * * @author clarck * */ public class Subject { private List<Observer> observers = new ArrayList<Observer>(); /** * 添加观察者 * * @param observer */ public void attach(Observer observer) { observers.add(observer); } /** * 移除观察者 * * @param observer */ public void detach(Observer observer) { observers.remove(observer); } /** * 通知 */ public void notification() { for (Observer observer : observers) { observer.update(); } } }
Observer:
package com.cnblog.clarck; /** * 抽象观察者 * * @author clarck * */ public abstract class Observer { public abstract void update(); }
ConcrateSubject:
package com.cnblog.clarck; /** * 具体主题/具体通知者 * * @author clarck * */ public class ConcrateSubject extends Subject { private String mSubjectState; public String getSubjectState() { return mSubjectState; } public void setSubjectState(String mSubjectState) { this.mSubjectState = mSubjectState; } }
ConcrateObserver:
package com.cnblog.clarck; /** * 具体观察者 * * @author clarck * */ public class ConcrateObserver extends Observer { private String mName; private String mObserverState; private ConcrateSubject mSubject; public ConcrateObserver(ConcrateSubject subject, String name) { mSubject = subject; mName = name; } @Override public void update() { mObserverState = mSubject.getSubjectState(); String format = String.format("观察者%s的新状态是%s", mName, mObserverState); System.out.println(format); } public ConcrateSubject getmSubject() { return mSubject; } public void setmSubject(ConcrateSubject mSubject) { this.mSubject = mSubject; } }
Client:
package com.cnblog.clarck; public class Client { public static void main(String[] args) { ConcrateSubject concrateSubject = new ConcrateSubject(); concrateSubject.attach(new ConcrateObserver(concrateSubject, "X")); concrateSubject.attach(new ConcrateObserver(concrateSubject, "Y")); concrateSubject.attach(new ConcrateObserver(concrateSubject, "Z")); concrateSubject.setSubjectState("ABC"); concrateSubject.notification(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本