[C++代码] #include <iostream> const OBS_MAXNUM=20;//最多与OfficeDoc对象相关联的DocExplorer对象的个数 (1) ; class DocExplorer{ //关注OfficeDoc公文对象的类 public:DocExplorer( (2) *doc); //构造函数 (3) void update(OfficeDoc *doc)=0;//更新自身状态的函数//其他相关属性和方法省略 }; class OfficeDoc{ //公文类 private:DocExplorer *myObs[OBS_MAXNUM]; //关注此公文类的DocExplorer类对象指针数组 int index; //与OfficeDoc对象关联的DocExplorer对象的个数 public:OfficeDoe()index=0;}void attach(DocExplorer *o){ //将一DoeExplorer对象与OfficeDoe对象相关联 if(index >=OBS_MAXNUM ||o=NULL)return; for(int loop=0; loop<index; loop++) if(myObs[loop]==o) return; myObs[index]=o; index++;}void detaeh(DocExplorer *o){ //接触某DoeExplorer对象与OfficeDoc对象的关联 if(0==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){//DocExplorer 类对象的构造函数doc-> (5) ; //将此DocExplorer对象与doc对象相关联 }