试题七(共15分)
阅读以下说明和C代码,将应填入_____(n)____ 处的字句写在答题纸的对应栏内。
[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文件的内容或状态发生变化时,与之相 关联的DocExplorer 结构的值都需要发生改变。一个OfficeDoc 结构能够关联一组DocExplorer 结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer 结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。
[C代码]
#include <stdio.h>
#define OBS_MAXNUM 20 /*一个OfficeDoc 变量最多能够关联的DocExplorer变量的个数*/
typedef void (____(1)____) (struc OfficeDoc * ,struct DocExplorer *);
struct DocExplorer {
func update; /*DocExplorer 结构采用的更新函数*/
/*其它的结构字段省略*/
};
struct OfficeDoc{
___(2)____ myObs[OBS_MAXNUM];
/*存储所有与OfficeDoc 相关联的DocExplorer结构指针*/
int index; /* 与OfficeDoc 结构变量相关联的DocExplorer 结构变量的个数*/
};
void attach(struct OfficeDoc *doc, struct DocExplorer *ob){
/*关联Obersver 结构ob与OfficeDoc结构doc*/
int loop = 0;
if (doc -> index >= OBS_MAXNUM || ob == NULL) return;
for(loop = 0; loop < doc->index; loop++)
if (doc -> myObs[loop] == ob) return;
doc->myObs[doc->index] = ob;
doc->index++;
}
void detach(struct OfficeDoc *doc, struct DocExplorer *ob){
/*解除doc 结构与ob结构间的关系*/
int loop;
if(ob == NULL) return;
for(loop = 0;loop < doc->index; loop++){
if(doc->myObs[loop] == ob){
if (loop <= doc->index - 2)
doc->myObs[loop] = doc->myObs[____(3)____];
doc->myObs[doc->index-1] = NULL;doc->index--;
breack;
}
}
}
void update1(struct OfficeDoc *doc, struct DocExplorer *ob){
/*更新ob结构的值,更新代码省略*/ }
void update2(struct OfficeDoc *doc, struct DocExplorer *ob){
/*更新ob结构的值,更新代码省略*/ }
void notifyObs(struct OfficeDoc *doc){
/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer 结构变量*/
int loop;
for(loop = 0; loop < doc->index; loop++){
(doc->myObs[loop])->update(____(4)____);
}
}
void main() {
struct OfficeDoc doc; /* 定义一OfficeDoc 变量*/
struct DocExplorer explorer1,explorer2; /*定义两个DocExplorer变量*/
/*初始化与OfficeDoc 变量相关的DocExplorer变量个数为0*/
doc.index = 0;
explorer1.update = update1; /* 设置explorer1 变量的更新函数*/
explorer2.update = update2; /* 设置explorer2 变量的更新函数*/
attach(&doc , &explorer1); /* 关联explorer1 与doc对象*/
attach(&doc , &explorer1); /* 关联explorer1 与doc对象*/
/*其它代码省略*/
_____(5)____; /* 通知与OfficeDoc 相关的所有DocExploer 变量*/
return;
}
阅读以下说明和C代码,将应填入_____(n)____ 处的字句写在答题纸的对应栏内。
[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文件的内容或状态发生变化时,与之相 关联的DocExplorer 结构的值都需要发生改变。一个OfficeDoc 结构能够关联一组DocExplorer 结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer 结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。
[C代码]
#include <stdio.h>
#define OBS_MAXNUM 20 /*一个OfficeDoc 变量最多能够关联的DocExplorer变量的个数*/
typedef void (____(1)____) (struc OfficeDoc * ,struct DocExplorer *);
struct DocExplorer {
func update; /*DocExplorer 结构采用的更新函数*/
/*其它的结构字段省略*/
};
struct OfficeDoc{
___(2)____ myObs[OBS_MAXNUM];
/*存储所有与OfficeDoc 相关联的DocExplorer结构指针*/
int index; /* 与OfficeDoc 结构变量相关联的DocExplorer 结构变量的个数*/
};
void attach(struct OfficeDoc *doc, struct DocExplorer *ob){
/*关联Obersver 结构ob与OfficeDoc结构doc*/
int loop = 0;
if (doc -> index >= OBS_MAXNUM || ob == NULL) return;
for(loop = 0; loop < doc->index; loop++)
if (doc -> myObs[loop] == ob) return;
doc->myObs[doc->index] = ob;
doc->index++;
}
void detach(struct OfficeDoc *doc, struct DocExplorer *ob){
/*解除doc 结构与ob结构间的关系*/
int loop;
if(ob == NULL) return;
for(loop = 0;loop < doc->index; loop++){
if(doc->myObs[loop] == ob){
if (loop <= doc->index - 2)
doc->myObs[loop] = doc->myObs[____(3)____];
doc->myObs[doc->index-1] = NULL;doc->index--;
breack;
}
}
}
void update1(struct OfficeDoc *doc, struct DocExplorer *ob){
/*更新ob结构的值,更新代码省略*/ }
void update2(struct OfficeDoc *doc, struct DocExplorer *ob){
/*更新ob结构的值,更新代码省略*/ }
void notifyObs(struct OfficeDoc *doc){
/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer 结构变量*/
int loop;
for(loop = 0; loop < doc->index; loop++){
(doc->myObs[loop])->update(____(4)____);
}
}
void main() {
struct OfficeDoc doc; /* 定义一OfficeDoc 变量*/
struct DocExplorer explorer1,explorer2; /*定义两个DocExplorer变量*/
/*初始化与OfficeDoc 变量相关的DocExplorer变量个数为0*/
doc.index = 0;
explorer1.update = update1; /* 设置explorer1 变量的更新函数*/
explorer2.update = update2; /* 设置explorer2 变量的更新函数*/
attach(&doc , &explorer1); /* 关联explorer1 与doc对象*/
attach(&doc , &explorer1); /* 关联explorer1 与doc对象*/
/*其它代码省略*/
_____(5)____; /* 通知与OfficeDoc 相关的所有DocExploer 变量*/
return;
}