阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某文件管理系统中定义了类OfficeDoc和DocExplorer。当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态。

admin2021-03-24  44

问题 阅读下列说明和C++代码,将应填入  (n)  处的字句写在答题纸的对应栏内。
【说明】
    某文件管理系统中定义了类OfficeDoc和DocExplorer。当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图5-1所示。
           
【C++代码】
    #include<iostream>
    #inelude<vector>
    #include<string>
    using namespace std;

    class Obseryer{
    public:
           (1)   
    };

    class Subject{
    protected:
        vector<  (2)  >myObs;
    public:
        virtual void Attach(Observer obs)(myObs.push_back(obs);}
        virtual void Detach(Observer obs){
        for  (vector<Observer>::iterator iter = myObs.begin();  iter !=
        myObs.end(); iter++){
        if(iter==obs){myObs.erase(iter);return;}
        }
        }
        virtual void Notify(){
    for(vector<Observer>::iterator iter=myObs.begin();iter!=myObs.end();
    iter++){
            (3)  ;}
    }
    virtualintgetStatus()=0;
    virtual void setStatus(int status)=0;
    };

    classOfficeDoc:publiC Subj ect{
    private:
        stringmySubjectName;
        intm_status;
    public:
        OfficeDoc(string name):mySubjectName(name),m_status(0){}
        voidsetStatus(int status){m_Status=status;}
        intqetStatus(){return m_status;}
    };

    classDocExplorer:public Observer{
    private:
        stringmyobsName;
    public:
    DocExplorer(string name,  (4)  sub):myObsName(name){ sub->  (5)  ;}
        void update(){ cout<<  "update observer:"  <<myObsName<<endl;}
    };
    Int main(){
        Subject subjectA=new OfficeDoc("subject A");
        Observer  observerA=new DocExplorer("obserVerA",  subjectA);
        subjectA->setstatus(1);  subjectA->Notify();
        return 0;
    }

选项

答案(1)virtualvoidupdate()=0 (2)Observer* (3)(*iter)->update() (4)Subject* (5)Attach(this)

解析 本题考查设计模式中的观察者(Observer)模式的基本概念和应用。
    观察者模式的意图是,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的结构图如图5-2所示。
   
    其中:
    ●Subject(目标)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。
    ●Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
    ●ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
    ●ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现Observer的更新接口,以使自身状态与目标的状态保持一致。
观察者模式适用于:
    ●当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
    ●当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
    ●当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。
    本题中的类Subject对应于图5-2中的Subject,类OfficeDoc对应ConcreteSubject;类Observer对应图5-2中的Observer,类DocExplore对应ConcreteObserver。DocExplore维护一个指向OfficeDoc对象的引用,当OfficeDoc的状态发生改变时,向DocExplore发出通知。
    第(1)空需要填写Observer中的核心方法,即在目标发生改变时通知观察者的更新接口。这个方法的原型可以在Obsever的子类DocExplore中找到:void update()。update方法需要在子类中进行重置,这里采用了C++中的动态多态机制一一纯虚拟函数。所以第(1)空应填入virtual void update()=0。
    一个Subject可以有多个观察者,在Subject中需要提供增加和删除观察者的接口,即类中的Attach、Detach方法。这两个方法的主要操作对象就是类中的属性myObs。根据程序上下文推断,myObs表示的应该是观察者的集合,所以第(2)空应填入Observer*
    第(3)空出现在Subject的方法Notify中,这个方法的功能是当目标发生变化时,通知所有与该目标关联的观察者,即调用每个观察者定义的update方法,所以第(3)空应填入(*iter)->update()。
    DocExplore是一个具体的观察者,它需要维护一个指向目标的对象,在这里实际上就是指向OfficeDoc的对象。观察者与目标的关联关系是通过DocExplore的构造函数实现的。在面向对象的继承机制中,通常倾向于用基类指针代替派生类指针,因此第(4)空应填入Subject*
    观察者与目标的关联关系的建立需要调用Subject中的方法Attach,因此第(5)空应填入Attach(this)。
转载请注明原文地址:https://kaotiyun.com/show/moxZ777K
0

相关试题推荐
最新回复(0)