从下列的3道试题(试题五至试题七)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。 |
试题五(共15分)
阅读以下说明和C++代码,将应填入_____(n)____ 处的字句写在答题纸的对应栏内。
[说明]
在一公文处理系统中,开发者定义了一个公文类OfficeDoc, 其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc 类对象的相应的DocExplorer 对象都要更新其自身的状态。一个OfficeDoc 对象能够关联一组DocExplorer 对象。当OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个C++ 源文件中,能够正确编译通过。
[C++代码]
#include <iostream>
const OBS_MAXNUM = 20 // 最多与OfficeDoc 对象相关联的DocExplorer 对象的个数
____(1)____;
class DocExploer { //关注OfficeDoc 公文对象的类
public:
DocExplorer (____(2)____ *doc); // 构造函数
_____(3)____
void update(OfficeDoc *doc)=0; //更新自身状态的函数
//其它相关属性和方法省略
}
class OfficeDoc{ // 公文类
private:
DocExploer *myObs[OBS_MAXNUM]; //关注此公文类的DocExplorer 类对象指针数组
int index; // 与OfficeDoc 对象关联的DocExploer 对象的个数
public:
OfficeDoc(){
index=0; }
void attach(DocExploer *o){
//将一DocExploer 对象与OfficeDoc 对象相关联
if (index >= OBS_MAXNUM || o == NULL) return;
for (int loop = 0; loop < index; loop++)
if (myObs[loop] == 0) return;
myObs[index] = o;index++;
}
void detach(DocExploer *o){
//解除某DocExploer 对象与OfficeDoc 对象的关联
if(o==NULL) return;
for(int loop = 0;
loop < index; loop++){
if(myObs[loop] == o){
if (loop <= index-2) myObs[loop] = myObs[index-1];
myObs[index-1] = NULL;
index--;
break;
}
}
}
private:
void notifyObs(){
// 通知所有的DocExplorer 对象更改自身状态
for(int loop = 0; loop <index; loop++){
myObs[loop]->____(4)____; //DocExplorer 对象更新自身状态
}
} //其它公文类的相关属性和方法 };
DocExplorer::DocExplorer(OfficeDoc *doc){
//DocExploer 类对象的构造函数
doc->____(5)____;
// 将此DocExplorer对象与doc 对象相关联
}
试题六(共15分)
阅读以下说明和Java代码,将应填入_____(n)____ 处的字句写在答题纸的对应栏内。[说明] 在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc 类对象的相应的DocExplorer 对象都要更新其自身的状态。一个OfficeDoc 对象能够关联一组DocExplorer 对象。当OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个Java源文件中,能够正确编译通过。
[Java 代码]
//Subject.java 文件
public interface Subject {
public void attach(Observer DocExplorer);
public void detach(Observer DocExplorer);
void notifyObservers(); }
//Observer,java 文件
public interface Obsever{
void update(____(1)____); }
//OfficeDoc.java 文件
import java.util.*;
public class OfficeDoc implements Subject { //OfficeDoc 类实现Subject 接口
private Vector ObserverVector = new java.util.Vector();
//存储与OfficeDoc 相关联的DocExplorer 对象
public void attach(Obsever observer){ //将某DocExplorer 对象与OfficeDoc 相关联 ObserverVector.addElement(observer); }
public void detach(Observer observer){ //解除某DocExplorer 对象与OfficeDoc的关联关系 ObserverVector.removeElement(observer); }
public void notifyObservers(){
//当OfficeDoc 对象状态已发生变化时,通知所有的DocExplorer 对象
Enumeration enumeration = ______(2)_____;
while (enumeration.hasMoreElements()){
((Observer)enumeration.nextElement())._____(3)_____;
}
}
public Enumeration Observers(){
return ObserverVector.elements(); }
//其它公文类的属性和方法省略
}
//DocExplorer.java 文件
public class DocExplorer implements _____(4)____{
public void update(____(5)____){
//更新 DocExplorer 自身的状态,代码省略
}
}
责任编辑:小草