问答题
[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当系统中的文件内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。
[C程序]
#include<stdio.h>
#define OBS_MAXNUM 20/*一个OfficeDoc变量最多能够关联的DocExplorer结构变量的个数*/
typedef void(______)(struct OfficeDoc*, struct DocExplorer*);
struct DocExplorer {
func update; /*DocExplorer结构采用的更新函数*/
/*其他的结构字段省略*/
};
Struct OfficeDoc {
______ 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 *b) {
/*解除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 [______];
doc→myObs[doc→index-1] = NULL;
doc—÷index-一j
break;
}
}
}
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(______);
}
}
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, &explorer2); /*关联explorer2与doc对象*/
/*其他代码省略*/
______; /*通知与OfficeDoc相关的所有DocExploer变量*/
return;
}