问答题 [Java代码] //Subject.java 文件 public interface Subject { public void attach(Observer DocExplorer); public void detach(Observer DocExplorer); void notifyObservers(); } //Observer.java 文件 public interface Observer{ void update({{U}} (1) {{/U}}); } //OfficeDoc.java 文件 import java.util.*; public class OfficeDoc implements Subject(//OfficeDoc 类实现 Subject 接口 private Vector ObserverVeetor=new java.util.Vector(); //存储与OfficeDoc相关联的DocExplorer 对象 public void attach(Observer observer){ //将某 DocExplorer 对象与OfficeDoc 相关联 ObserverVector.addElement(observer); } public void detach(Observer observer){ //解除某DocExplorer 对象与OfficeDoc的关联关系 ObserverVector.removeElement(observer); } public void notifyObservers(){ //当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象 Enumeration enumeration={{U}} (2) {{/U}}; while (enumeration.hasMoreElements()){ ((Observer)enumeration.nextElement()).{{U}} (3) {{/U}}; } } public Enumeration Observers(){ return ObserverVector.elements(); } //其他公文类的属性和方法省略 } //DoeExplorer.java 文件 public class DocExplorer implements {{U}}(4) {{/U}}{ public void update({{U}} (5) {{/U}}){ //更新DocExplorer自身的状态,代码省略 } }
【正确答案】
【答案解析】(1) Subject subject(注:第二个subject可用其他标识符替换) (2) Observers() (3) update(this) (4) Observer (5) Subject subject(注:第二个subject可用其他标识符替换) [分析] 第(1)空处观察者对象更新自身的状态,更新的数据应该来自被观察者对象,所以此处应该为一Subject,因此第(1)空的答案为Subject subject。同样的道理,第(5)空和第(1)空是相同的。 notifyObservers方法通知所有的观察者对象更新自身的状态,所以(2)空处应该返回所有的观察者对象,调用方法Observers()即可获得。第(3)空处对每个观察者对象更新状态,所以应该调用update方法,update方法需要此被观察者对象作为参数,所以使用this来获取对象自身。DocExplorer是一个观察者,因此需要实现接口Observer,第(4)空为Observer。