阅读以下说明和Java代码,将应填入(n)处。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码采用Java语言实现,能

题目

阅读以下说明和Java代码,将应填入(n)处。

[说明]

在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码采用Java语言实现,能够正确编译通过。

[Java代码]

//Subject.java 文件

public interface Subject {

public void attach(Observer DocExplorer);

public void detach(Observer DocExplorer);

void notifyObservers();

}

//Observer.java 文件

public interface Observer{

void update((1) );

}

//OfficeDoc.java 文件

import java.util.*;

public class OfficeDoc implements Subject(//OfficeDoc 类实现 Subject 接口

private Vector bserverVeetor=new java.util.Vector();

//存储与OfficeDoc相关联的DocExplorer 对象

public void attach(Observer observer){

//将某 DocExplorer 对象与OfficeDoc 相关联

ObserverVector.addElement(observer);

}

public void detach(Observer observer){

//解除某DocExplorer 对象与OfficeDoc的关联关系

ObserverVector.removeElement(observer);

}

public void notifyObservers(){

//当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象

Enumeration enumeration=(2);

while (enumeration.hasMoreElements()){

((Observer)enumeration.nextElement()).(3);

}

}

public Enumeration Observers(){

return ObserverVector.elements();

}

//其他公文类的属性和方法省略

}

//DoeExplorer.java 文件

public class DocExplorer implements (4) {

public void update( (5) ){

//更新DocExplorer自身的状态,代码省略

}

}


相似考题

3.阅读以下说明和C++代码,将应填入(n)处。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorcr对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个C++源文件中,能够正确编译通过。[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对象相关联}

更多“阅读以下说明和Java代码,将应填入(n)处。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码采用Java语言实现,能”相关问题
  • 第1题:

    阅读以下技术说明及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。

    [说明]

    在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件中内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为Observer(观察者)模式。以下代码采用C++语言实现,能够正确编译通过。

    [C++代码]


    正确答案:Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系以便当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。首先DocExplorer需要知道OfficeDoc是一个类但由于OfficeDoc定义在DocExplorer之后因此需要在DocExplorer类的定义前加上class OfficeDoc的声明即(1)空缺处所填写的内容是:class OfficeDoc。 (2)空缺处可根据程序最后的构造函数的实现知道应该填写OfficeDoc。在观察者模式中不同的观察者更新自身的方法不同因此(3)空缺处应填写virtual而且程序最后的“=0”也表明是一个纯虚拟函数。 由(4)空缺处所在行的程序注释说明可知所有与OfficeDoc相关联的对象更新自身状态因此需要使用update函数。但update函数的参数是一个OfficeDoc类的对象所以参数应该为this。 (5)空缺处所在行语句的功能是将OfficeDoc类的对象和DocExplorer类的对象相关联关联的函数是OfficeDoc中的attach方法其参数是一个DocExplorer对象使用this能够表示当前的对象因此该空缺处应填写attach(this)。
    Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。首先,DocExplorer需要知道OfficeDoc是一个类,但由于OfficeDoc定义在DocExplorer之后,因此需要在DocExplorer类的定义前加上class OfficeDoc的声明,即(1)空缺处所填写的内容是:class OfficeDoc。 (2)空缺处可根据程序最后的构造函数的实现知道,应该填写OfficeDoc。在观察者模式中,不同的观察者更新自身的方法不同,因此(3)空缺处应填写virtual,而且程序最后的“=0”也表明是一个纯虚拟函数。 由(4)空缺处所在行的程序注释说明可知,所有与OfficeDoc相关联的对象更新自身状态,因此需要使用update函数。但update函数的参数是一个OfficeDoc类的对象,所以参数应该为this。 (5)空缺处所在行语句的功能是,将OfficeDoc类的对象和DocExplorer类的对象相关联,关联的函数是OfficeDoc中的attach方法,其参数是一个DocExplorer对象,使用this能够表示当前的对象,因此该空缺处应填写attach(this)。

  • 第2题:

    阅读以下说明和C代码,将应填入(n)处。

    [说明]

    在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性(字段)。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。

    [C代码]

    include <stdio.h>

    define OBS_MAXNUM 20 /*一个OfficeDoc变量最多能够关联的*/

    /*DoeExplorer变量的个数*/

    typedef void((1))(struct OfficeDoc*,street DocExplorer*);

    struct DocExplorer{

    func update;/* DocExplorer结构采用的更新函数*/

    /*其他的结构字段省略*/

    };

    struct OfficeDoc{

    (2) myObs[OBS_MAXNUM];

    /*存储所有与OfficeDoc相关联的DoeExplorer结构指针*/

    int index;/*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/

    };

    void attach(struet OfficeDoc *doc, struet DocExplorer *ob){

    /*关联Obersver结构ob与OfficeDoe结构doc*/

    int loop=0;

    if(doc->index >=OBS_MAXNUM || b==NULL) return;

    for(loop=0; loop <doc->index; loop++)

    if(doc->myObs[loop]==ob)return;

    doc->myObs[doe->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; loop6++){

    if(doc->myObs[loop]==ob){

    if(loop<=doc->index-2)

    doe->myObs[loop]=doc->myObs[ (3) ];

    doc->myObs[doe->indox-1]=NULL;

    doe->index--;

    break;

    }

    }

    }

    void updatel(struct OfficeDoc *doc,struct DocExplorer *ob){

    /*更新ob结构的值,更新代码省略*/

    }

    void update2(stmct OfficeDoc *doc, struct DocExplorer *ob){

    /*更新ob结构的值,更新代码省略*/

    }

    void notifyObs(struet OfficeDoc *doc){

    /*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/

    int loop;

    for(loop=0; loop <doc->index; loop++){

    (doc->myObs[loop])->update((4));

    }

    }

    void main(){

    stmct OfficeDoc doc;/*定义一OfficeDoc变量*/

    struct DocExplorer explorer1, explorer2;/*定义两个DocExplorer变量*/

    /*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/

    doc.index=0;

    explorer1.update=update1;/*设置explorer1变量的更新函数*/

    explorer2.update=update2;/*设置explorer2变量的更新函数*/

    attaeh(&doc,&explorer1);/*关联explorer1与doc对象*/

    attach(&doc,&explorer2);/*关联explorer2与doc对象*/

    /*其他代码省略*/

    (5);/*通知与OfficeDoc相关的所有DocExplorer变量*/

    return;

    }


    正确答案:(1) *func (2) struct DocExplorer* (3) doc->index-1或等价形式 (4) doc和doc->myObs[loop]或等价形式 (5) notifyObs(&doc)
    (1) *func (2) struct DocExplorer* (3) doc->index-1,或等价形式 (4) doc和doc->myObs[loop],或等价形式 (5) notifyObs(&doc) 解析:DocExplorer中func是中类型,而且根据(1)处的其余部分,此定义是一个函数类型的定义,因此(1)处答案为 *func。
    一个OfficeDoc关联多个DocExplorer,因此(2)处应该为Docexplorer或者 DocExplorer*,注释中明确说明是指针,所以答案为DocExplorer*。
    for循环中检测doc结构指针是否是需要解除关联的结构,如果是,那么将doc结构数组中最后一个指针覆盖此doc指针所在位置,然后将最后一个指针域置空。所以(3)处应为index-1。
    notifyObs函数更新所有与OfficeDoc doc结构相关联的DocExplorer结构。因为 update的第一个参数是OfficeDoc结构指针,第二个参数是DocExplorer结构指针。因此,(4)空处应该填写doc和doc->myObs[loop],表示doc结构和其相关的DocExplorer结构。
    第(5)空处要求调用notifyObs方法,其参数要求为一个OfficeDoc结构指针,所以将doc的地址传递给参数,答案为notifyObs(&doc),表示通知所有与doc相关的其他结构。

  • 第3题:

    阅读以下说明和C代码(代码13-4),将应填入(n)处的字句写在对应栏内。

    【说明】

    在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。

    【代码13-4】

    include<stdio.h>

    define OBS_MAXNUM 20 /*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/

    typedef void( (1) )(struc OffieeDoc*, struct DoeExplorer*)I;

    struct DocExplorer{

    func update;/*DocExplorer结构采用的更新函数*/

    /*其它的结构字段省略*/

    };

    struet OffieeDoc{

    (2) myObs[OBS_MAXNUM];

    /*存储所有与OfficeDoc相关联的DocExplorer结构指针*/

    int index;/*与OffieeDoc结构变量相关联的DoeExplorer结构变量的个数*/

    };

    void attaeh(struct OfficeDoc*doc, struct DocExplorer*ob){

    /*关联Observer结构ob与OffieeDoe结构doe*/

    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[doe->index]=ob;

    doc->index++;

    }

    void detaeh(struct OfficeDoc*doc, struct DocExplorer*ob){

    /*解除doc结构与ob结构间的关联*/

    int loop;

    if(ob==NULL)return;

    for(loop=0;loop<doc->index; loop++){

    if(doe->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 OfficeDoe*doe, struct DoeExplorer *ob){

    /*更新ob结构的值,更新代码省略*/

    } void update2(struct OffieeDoc*doc,struet 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 main(){

    struct OfficeDoc doc; /*定义一了OfficeDoe变量*/

    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); /*通知与OfficeDoe相关的所有DoeExploer变量*/

    return;

    }


    正确答案:(1)*func (2)struct DocExplorer* (3)doc->index-1或等价形式(4)docdoc->myObs[loop]或等价形式 (5)notifyObs(&doc)
    (1)*func (2)struct DocExplorer* (3)doc->index-1,或等价形式(4)doc,doc->myObs[loop],或等价形式 (5)notifyObs(&doc) 解析:在结构体DocExplorer的定义中,func是一种类型,语句“func update;”定义了类型为 func的变量update,又根据(1)空所在行的其它信息,可知typedef是在声明指向函数的指针类型,该函数的参数列表为(struc OfficeDoc*,struct DocExplorer*),返回值类型为 void,因此第(1)空填:*func。这是用tpyedet。声明指向函数的指针类型的格式。
    根据第(2)空下一行的注释可知,该语句是将DocExplorer结构体指针存储在OfficeDoc中,所以可知第(2)空是定义一个DocExplorer指针数组变量,因此,第(2)空填: struct DocExplorer*。
    根据函数detach里面的语句“doc->myObs[doc->index-1]=NULL;doe-> index——;”可知,其功能是使关联个数减1。并将数组。myObs的最后一个关联结构体的指针置空。如果要解除关联的是数组的最后一个元素doc->myObs[doc->—index-1],那么可直接将其置空;但如果要解除关联的结构体不是最后一个呢?显然,语句:
    if(loop=doc->—index-2)
    doc->—myObs[loop]=doc->—myObs[(3)];便是用来处理这种情况的。由于关联总个数减1,导致最后一个元素丢失,而在这种情况下要解除关联的结构体并非最后一个元素,因此不能丢失最后一个元素,而要将其保存在要解除关联的结构体指针中,这样一举两得,既保存了不该解除的,又解除了该解除的结构体。因此,第(3)空填:doe->index-1。
    第(4)空是要填函数update的实参列表,而update是func类型,对照第(1)空所在行的形参列表,显然可得第(4)空填“doc,doc->myObs[loop]”。特别要注意,不能少了逗号,因为update函数有两个参数。
    函数notifyObs的形参为结构体OfficeDoc的指针类型,因此第(5)空在调用该函数时要传递一个地址,所以填:notifyObs(&doc)。

  • 第4题:

    一个类定义了一组大体相似的对象,这些对象共享( )。

    A.属性和状态
    B.对象名和状态
    C.行为和多重度
    D.属性和行为

    答案:D
    解析:
    试题分析本题考查面向对象的基本知识在面向对象系统中,对象是基本的运行时的实体,它既包括数据(属性),也包括作用于数据的操作(行为)所以,一个对象把属性和行为封装为一个整体封装是一种信息隐蔽技术,它的目的是使对象的使用者和生产者分离,使对象的定义和实现分开从程序设计者来看,对象是一个程序模块;从用户来看,对象为他们提供了所希望的行为在对象内的操作通常叫做方法一个对象通常可由对象名、属性和方法三部分组成一个类定义了一组大体上相似的对象一个类所包含的方法和数据描述一组对象的共同行为和属性,这些对象共享这些行为和属性
    一个类产生的对象共享属性和行为

  • 第5题:

    以下关于子类和父类的叙述中,正确的是()。

    • A、代码中使用父类对象的地方,都可以使用子类对象替换
    • B、代码中使用子类对象的地方,都可以使用父类对象替换
    • C、父类定义的对象与子类定义的对象在属性和方法上一定相同
    • D、父类定义的对象与子类定义的对象在属性和方法上一定不同

    正确答案:A

  • 第6题:

    以下意图哪个是用来描述OBSERVER(观察者)?()

    • A、将抽象部分与它的实现部分分离,使它们都可以独立地变化
    • B、定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
    • C、用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
    • D、使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

    正确答案:B

  • 第7题:

    在J2EE中,伴随这时间的发生,相应的状态通常封装在一个对象1中,改对象必须继承自对象2.对象2通常做为单参传递给相应该事件的监听者的方法中。对象1和对象2分别代表()。 

    • A、 事件监听者,java.util.EventObject
    • B、 事件监听者,java.event.EventObject
    • C、 事件状态对象,java.util.EventObject
    • D、 事件对象,java.event,EventObject

    正确答案:C

  • 第8题:

    Decorator(装饰)模式的意图是:()。

    • A、定义一系列的算法,把它们一个个的封装起来,并且使它们可相互替换
    • B、为一个对象动态连接附加的职责
    • C、你希望只拥有一个对象,但不用全局对象来控制对象的实例化
    • D、在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖于它的对象都将得到通知并自动更新

    正确答案:B

  • 第9题:

    填空题
    ()模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,也就是让对象能在状态改变时被通知。

    正确答案: 观察者
    解析: 暂无解析

  • 第10题:

    单选题
    以下哪一个模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新()
    A

    观察者模式

    B

    代理模式

    C

    外观模式

    D

    备忘录模式


    正确答案: C
    解析: 暂无解析

  • 第11题:

    单选题
    以下意图哪个是用来描述VISITOR(访问者)?()
    A

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

    B

    表示一个作用于某对象结构中的各元素的操作

    C

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

    D

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象


    正确答案: A
    解析: 暂无解析

  • 第12题:

    单选题
    在J2EE中,伴随这时间的发生,相应的状态通常封装在一个对象1中,改对象必须继承自对象2.对象2通常做为单参传递给相应该事件的监听者的方法中。对象1和对象2分别代表()。
    A

     事件监听者,java.util.EventObject

    B

     事件监听者,java.event.EventObject

    C

     事件状态对象,java.util.EventObject

    D

     事件对象,java.event,EventObject


    正确答案: A
    解析: 暂无解析

  • 第13题:

    阅读以下技术说明及Java代码,将Java程序中(1)~(5)空缺处的语句填写完整。

    [说明]

    在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为Observer(观察者)模式。以下代码采用Java语言实现,能够正确编译通过。

    [Java代码]


    正确答案:Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系以便当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。(1)空缺处观察者对象更新自身的状态更新的数据应该来自被观察者对象所以此处应该为一Subject因此(1)空缺处所填写的内容是:Subject subject。同理(5)空缺处与(1)空缺处所填写的内容是相同的。 notifyObservers方法通知所有的观察者对象更新自身的状态因此(2)空缺处应该返回所有的观察者对象调用方法Observers()即可获得。(3)空缺处对每个观察者对象更新状态所以应该调用update方法update方法需要此被观察者对象作为参数所以使用this宋获取对象自身。DocExplorer是一个观察者因此需要实现接口Observer即(4)空缺处所填写的内容是:Observer。
    Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(1)空缺处观察者对象更新自身的状态,更新的数据应该来自被观察者对象,所以此处应该为一Subject,因此(1)空缺处所填写的内容是:Subject subject。同理,(5)空缺处与(1)空缺处所填写的内容是相同的。 notifyObservers方法通知所有的观察者对象更新自身的状态,因此(2)空缺处应该返回所有的观察者对象,调用方法Observers()即可获得。(3)空缺处对每个观察者对象更新状态,所以应该调用update方法,update方法需要此被观察者对象作为参数,所以使用this宋获取对象自身。DocExplorer是一个观察者,因此需要实现接口Observer,即(4)空缺处所填写的内容是:Observer。

  • 第14题:

    读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    已知某类库开发商捉供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示,其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。

    当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如上图中的类MyApplication和类MyDocument,并分别实现Application和 Document类中的某些方法。

    已知Application类中的openDocument方法采用了模板方法(Template Method)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示:

    1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回;

    2.创建文档对象;

    3.通过文档对象打开文档;

    4.通过文档对象读取文档信息;

    5.将文档对象加入到Application的文档对象集合中。

    【Java代码】

    abstract class Document{

    public void save(){/*存储文档数据,此处代码省略*/ )

    public void open(String docName){ /*打开文档,此处代码省略*/)

    public void close(){ /*关闭文档,此处代码省略*/)

    public abstract void read(String docName);

    };

    abstract class Appplication{

    private Vector<(1)> docs; /*文档对象集合*/

    public boolean canOpenDocument(String docName){

    /*判断是否可以打开指定文档,返回真值时表示可以打开,

    返回假值表示不可打开,此处代码省略*/

    }

    public void addDocument(Document aDocument){

    /*将文档对象添加到文档对象集合中*/

    docs.add((2));

    }

    public abstract Document doCreateDocument();/*创建一个文档对象*/

    public void openDocument(String docName){/*打开文档*/

    if ((3)) {

    System.out.println(“文档无法打开!”);

    return;

    }

    (4) adoc=(5);

    (6);

    (7);

    (8);

    }

    };


    正确答案:(1)Document (2)aDocument (3)!canOpenDocument(docName) (4)Document (5)doCreateDocument() (6)adoc.open(docName) (7)adoc.read(docName) (8)addDocument(adoc)
    (1)Document (2)aDocument (3)!canOpenDocument(docName) (4)Document (5)doCreateDocument() (6)adoc.open(docName) (7)adoc.read(docName) (8)addDocument(adoc) 解析:本题考查了Java语言的应用能力和模板方法设计模式。空(1)考查了Java库中Vector模板类的使用,由于Vector模板类可以存储任意类型,在定义时需要指定其存储类型,根据后面的代码,能够加入到该文档集合对象的类型为文档类型,因此空(1)处的类型应该为Document。空(2)处将文档对象加入文档集合对象中。从空(3)开始的代码属于图中Application类的OpenDocument方法,该方法是模板方法,因此,需根据题目给出的步骤一一对应填空。空(3)处判断能否打开文档,需要调用父类自己的方法canOpen- Document。其次需要创建文档对象,调用doCreateDocument方法,接着通过文档对象打开和读取文档,最后通过addDocument方法将该文档对象加入到文档对象集合中。所有这些方法都是在父类或文档对象中进行定义,不涉及到具体的子类。而子类负责要实现这些模板方法中需要调用的方法以便运行时被调用。

  • 第15题:

    阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。

    当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如上图中的类MyApplication和类MyDocument,并分别实现Application和 Document类中的某些方法。

    已知Application类中的openDocument方法采用了模板方法(Template Method)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示:

    1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回;

    2.创建文档对象;

    3.通过文档对象打开文档;

    4.通过文档对象读取文档信息;

    5.将文档对象加入到Application的文档对象集合中。

    【C++代码】

    include<iostream>

    include<vector>

    using namespace std;

    class Document{

    public:

    void save(){/*存储文档数据,此处代码省略*/)

    void open(string docName){ /*打开文档,此处代码省略*/)

    void close(){ /*关闭文档,此处代码省略*/)

    virtual void read(string docName) =0;

    };

    class Appplication{

    private:

    vector<(1)> docs; /*文档对象集合*/

    public:

    bool canOpenDocument(string docName){

    /*判断是否可以打开指定文档,返回真值时表示可以打开,

    返回假值表示不可打开,此处代码省略*/

    }

    void addDocument(Document * aDocument){

    /*将文档对象添加到文档对象集合中*/

    docs.push_back((2));

    }

    virtual Document * doCreateDocument()=0;/*创建一个文档对象*/

    void openDocument(string docName){/*打开文档*/

    if ((3)){

    cout<<“文档无法打开!”<<endl;

    return;

    }

    (4) adoc=(5);

    (6);

    (7);

    (8);

    }

    };


    正确答案:(1)Document* (2)aDocument (3)!canOpenDocument(docName) (4)Document* (5)doCreateDocument() (6)adoc->open(docName) (7)adoc->read(docName) (8)addDocument(adoc)
    (1)Document* (2)aDocument (3)!canOpenDocument(docName) (4)Document* (5)doCreateDocument() (6)adoc->open(docName) (7)adoc->read(docName) (8)addDocument(adoc) 解析:本题考查了C++语言的应用能力和模板方法设计模式。空(1)考查了C++标准库中Vector模板类的使用,由于Vector模板类可以存储任意类型,在定义时需要指定其存储类型,根据后面的代码,能够加入到该文档集合对象中的元素是各个文档的指针,因此空(1)处的类型应该为文档指针类型。空(2)处将文档指针加入文档集合对象中。从空(3)开始的代码属于图中Application类的OpenDocument方法,该方法是模板方法,因此,需根据题目给出的步骤一一对应填空。空(3)处判断能否打开文档,需要调用父类自己的方法canOpenDocument。其次需要创建文档对象,调用doCreateDocument方法,接着通过文档对象打开和读取文档,最后通过addDocument方法将该文档对象加入到文档对象集合中。所有这些方法都是在父类或文档对象中进行定义,不涉及到具体的子类,子类负责要实现这些模板方法中需要调用的方法以便运行时被调用。

  • 第16题:

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



    答案:
    解析:
    1: void update()2: Observer3: obs.update()4: Subject5: Attach(this)

  • 第17题:

    ()模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,也就是让对象能在状态改变时被通知。


    正确答案:观察者

  • 第18题:

    以下哪一个模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新()

    • A、观察者模式
    • B、代理模式
    • C、外观模式
    • D、备忘录模式

    正确答案:A

  • 第19题:

    所有的对象可以成为各种对象类,每个对象类都定义了一组()

    • A、说明
    • B、方法
    • C、过程
    • D、类型

    正确答案:B

  • 第20题:

    类定义了一组具有状态和行为的对象,这些对象具有相同的属性、操作、关系和语义。


    正确答案:正确

  • 第21题:

    填空题
    能够定义对象间的一种“一对多”的依赖关系,当一个对象的状态改变,所有依赖于它的对象都能得到通知并自动更新的设计模式的名称是()。

    正确答案: 观察者模式
    解析: 暂无解析

  • 第22题:

    单选题
    Decorator(装饰)模式的意图是:()。
    A

    定义一系列的算法,把它们一个个的封装起来,并且使它们可相互替换

    B

    为一个对象动态连接附加的职责

    C

    你希望只拥有一个对象,但不用全局对象来控制对象的实例化

    D

    在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖于它的对象都将得到通知并自动更新


    正确答案: B
    解析: 暂无解析

  • 第23题:

    单选题
    以下意图哪个是用来描述观察者模式()
    A

    将抽象部分与它的实现部分分离,使它们都可以独立地变化

    B

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

    C

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

    D

    使多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系


    正确答案: A
    解析: 暂无解析