zoukankan      html  css  js  c++  java
  • 软件设计师2005年11月下午试题5(C++ 观察者模式)

    [说明]
      在一公文处理系统中,开发者定义了一个公文类OfficeDoc, 其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc 类对象的相应的DocExplorer 对象都要更新其自身的状态。一个OfficeDoc 对象能够关联一组DocExplorer 对象。当OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个C++ 源文件中,能够正确编译通过。
    [C++代码]
      #include <iostream>
      const OBS_MAXNUM = 20 // 最多与OfficeDoc 对象相关联的DocExplorer 对象的个数
      class OfficeDoc;

      class DocExploer {  //关注OfficeDoc 公文对象的类
      public:
       DocExplorer (OfficeDoc *doc); // 构造函数
       virtual void update(OfficeDoc *doc)=0; //更新自身状态的函数
       //其它相关属性和方法省略
      }


      class OfficeDoc{  // 公文类
      private:
       DocExploer *myObs[OBS_MAXNUM];  //关注此公文类的DocExplorer 类对象指针数组
       int index;  // 与OfficeDoc 对象关联的DocExploer 对象的个数
      public:
       OfficeDoc(){
        index=0; }
       void attach(DocExploer *o){
       //将一DocExploer 对象与OfficeDoc 对象相关联
       if (index >= OBS_MAXNUM || o == NULL) return;
       for (int loop = 0; loop < index; loop++)
        if (myObs[loop] == 0) return;
        myObs[index] = o;index++;
       }
       void detach(DocExploer *o){
       //解除某DocExploer 对象与OfficeDoc 对象的关联
        if(o==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]->update(this);  //DocExplorer 对象更新自身状态
        }
       }  //其它公文类的相关属性和方法 };
       DocExplorer::DocExplorer(OfficeDoc *doc){
       //DocExploer 类对象的构造函数
        doc->attach(this);
        // 将此DocExplorer对象与doc 对象相关联
       } 

  • 相关阅读:
    JS字符串函数String.replace()[转]
    分辨率和比例尺[转]
    DateDiff 函数的用法 SQL时间比较
    ASP.NET 2.0 本地化2
    ASP.NET 2.0 本地化1
    简单的分页过程,确在第10,20,30....等页,不能显示,请求帮忙,谢谢
    JQuery打造的分页无刷新的Repeater
    让flash置于DIV层之下的方法,让flash不挡住飘浮层或下拉菜单
    VS2005 + VSS6.0 简单应用示例
    SQLServer查询最近一天,三天,一周,一月,一季度方法
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2092619.html
Copyright © 2011-2022 走看看