观察者模式
2022/2/7 23:53:37
本文主要是介绍观察者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
观察者模式又叫做发布-订阅模式。
定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。
Subject:主题或抽象通知者。把所有对观察者对象的引用保存在一个聚合里面。
public abstract class Subject { private List<Observer> observers = new ArrayList<>(); //增加观察者 public void attach(Observer observer){ observers.add(observer); } //移除观察者 public void detach(Observer observer){ observers.remove(observer); } //通知 public void notifyData(){ for (Observer ob:observers) { ob.update(); } } }
Observer,抽象观察者,在得到主题的通知时更新自己。
public abstract class Observer { public abstract void update(); }
ConcreteSubject,具体主题或具体通知者,将有关状态存入。具体主题的内部状态变化,给所有观察者发出通知
public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
ConcreteObserver,具体观察者,使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。
public class ConcreteObserver extends Observer { private String name; private String observerState; private ConcreteSubject subject; public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } @Override public void update() { observerState = subject.getSubjectState(); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
Main:
public class Main { public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject(); concreteSubject.attach(new ConcreteObserver("x",concreteSubject)); concreteSubject.attach(new ConcreteObserver("y",concreteSubject)); concreteSubject.attach(new ConcreteObserver("z",concreteSubject)); concreteSubject.setSubjectState("abc"); concreteSubject.notifyData(); } }
使用场景:当一个对象的改变需要同时改变其他对象的时候。
这篇关于观察者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)