)
摘要本文介绍了观察者模式的核心概念与实战应用。该模式定义一对多依赖关系当目标状态改变时所有观察者都将收到通知并更新。文章以“B站UP主与粉丝”作比喻UP主是目标粉丝是观察者UP主发布新视频或动态时所有粉丝都会收到通知。文中给出完整Java代码实现包括Subject和Observer接口、具体目标类和观察者类并演示了添加、删除观察者及状态通知的全过程最后附上软考真题帮助巩固。目录结构图代码实战软考真题结构图意图定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新.比喻适用性代码//目标接口 interface Subject{ public void Attach(Observer observer);//添加一个观察者 public void Detach(Observer observer);//删除一个观察者 public void Notify();//(状态改变后)通知所有观察者 public void setState(String state);//改变目标状态 public String getState();//获取目标状态 } //观察者接口 interface Observer{ public void update();//(收到通知后)更新观察者的状态 } //Up主 class ConcreteSubject implements Subject{ private String name; private String state; private ListObserver observerList;//观察者list(粉丝们) //构造器 public ConcreteSubject(String name) { state 未更新; this.name name; observerList new ArrayListObserver(); } Override public void Attach(Observer observer) { observerList.add(observer);//添加一个观察者 } Override public void Detach(Observer observer) { observerList.remove(observer);//删除一个观察者 } Override public void Notify() { for(Observer observer:observerList){//通知每一个观察者 observer.update(); } } Override public void setState(String state) { this.state state; System.out.println(name 的状态发生变化变化后的状态为state); Notify();//状态改变后要通知所有观察者 } Override public String getState() { return state; } } //粉丝 class ConcreteObserver implements Observer{ private String state; private String name; private Subject subject; public ConcreteObserver(String name, Subject subject){ this.name name; this.subject subject; subject.Attach(this); state subject.getState(); } Override public void update() { System.out.println(name 收到通知); state subject.getState();//让当前观察者的状态和目标的最新状态保持一致 System.out.println(name 改变后的状态为state); } }测试一下public class test01 { public static void main(String[] args) { //创建一个UP主 Subject subjectA new ConcreteSubject(缴鸿剑Jackson); //创建三个B站用户并关注上述UP主(缴鸿剑Jackson) Observer observer1 new ConcreteObserver(张三, subjectA); Observer observer2 new ConcreteObserver(李四, subjectA); Observer observer3 new ConcreteObserver(王五, subjectA); //测试1改变UP主的状态(会通知到每个B站用户) subjectA.setState(更新了一个最新视频); System.out.println(); //测试2改变UP主的状态(会通知到每个B站用户) subjectA.setState(发布了一条日常动态); System.out.println(); //测试3将B站用户“王五”从UP主的粉丝列表移除然后再改变UP主的状态 subjectA.Detach(observer3); subjectA.setState(上传了一组精美图片); } }运行结果如下缴鸿剑Jackson的状态发生变化变化后的状态为更新了一个最新视频 张三收到通知 张三改变后的状态为更新了一个最新视频 李四收到通知 李四改变后的状态为更新了一个最新视频 王五收到通知 王五改变后的状态为更新了一个最新视频 缴鸿剑Jackson的状态发生变化变化后的状态为发布了一条日常动态 张三收到通知 张三改变后的状态为发布了一条日常动态 李四收到通知 李四改变后的状态为发布了一条日常动态 王五收到通知 王五改变后的状态为发布了一条日常动态 缴鸿剑Jackson的状态发生变化变化后的状态为上传了一组精美图片 张三收到通知 张三改变后的状态为上传了一组精美图片 李四收到通知 李四改变后的状态为上传了一组精美图片 Process finished with exit code 0实战软考真题选择题1选择题22014上半年我的答案第一空Subject第二空observer.update(tempareture, humidity, cleanness)第三空notifyObservers()第四空measurementsChanged()第五空Observer第六空envData.registerObserver(this)官方答案2019下半年我的答案第一空void update()第二空Observer第三空obs.update()第四空Subject第五空Attach(this)官方答案以上就是本篇文章的全部内容喜欢的话可以留个免费的关注呦~~~