观察者模式
1.观察者模式简介
当对象间存在一对多关系时,则可使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者
模式属于行为型模式。
使用场景:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
注意:目前java中已经有对观察者进行支持的类。
2.实现Demo
观察者模式使用三个类 Subject、Observer 和 Client(ObserverPatternDemo)。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。
我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
import java.util.List; import java.util.ArrayList; class Subject { private int state; private List<Observer> lists = new ArrayList<Observer>(); public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer) { lists.add(observer); } public void notifyAllObservers() { for (Observer observer : lists) { observer.update(); } } } abstract class Observer { protected Subject subject; abstract public void update(); } class BinaryObserver extends Observer { public BinaryObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Binary String: " + Integer.toBinaryString(subject.getState())); } } class OctalObserver extends Observer { public OctalObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Octal String: " + Integer.toOctalString(subject.getState())); } } class HexObserver extends Observer { public HexObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Hexa String: " + Integer.toHexString(subject.getState()).toUpperCase()); } } public class ObserverPatternDemo { public static void main(String args[]) { Subject subject = new Subject(); Observer binaryObserver = new BinaryObserver(subject); Observer octalObserver = new OctalObserver(subject); Observer hexObserver = new HexObserver(subject); subject.setState(10); subject.setState(20); } }
参考:http://www.runoob.com/design-pattern/observer-pattern.html
posted on 2019-04-18 21:13 Hello-World3 阅读(71) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!