试题七(共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; } |