阅读以下说明和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 *);
Struet 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 updatel(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 msin()
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对象*/
/*其他代码省略*/
(5) ;/*通知与OfficeDoc相关的所有DocExplorer变量*/
return;