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

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



相似考题

1.阅读以下说明和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自身的状态,代码省略}}

2.试题五(共15分)阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图5-1所示。采用状态( State)模式来实现该纸巾售卖机,得到如图5-2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图5-1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。【C++代码】include<iostream>using namespace std;∥以下为类的定义部分class TissueMachine; //类的提前引用class State{public:virtual void insertQuarter()=0; //投币virtual void ejectQuarter()=0; //退币virtual void turnCrank()=0; //按下“出纸巾”按钮virtual void dispense()=0; //出纸巾};/*类SoldOutState. NoQuarterState. HasQuarterState. SoldState的定义省略,每个类中均定义了私有数据成员TissueMachine* tissueMachine;*/class TissueMachine{private:(1) *soldOutState, *noQuarterState, *hasQuarterState,*soldState, *state;int count, //纸巾数public:TissueMachine(int numbers);void setState(State* state);State* getHasQuarterState();State* getNoQuarterState();State* getSoldState();State* getSoldOutState();int getCount();//其余代码省略};//以下为类的实现部分void NoQuarterState::insertQuarter(){tissueMachine->setState( (2) );}void HasQuarterState::ejectQuarter(){tissueMachine->setState( (3) );}void SoldState::dispense(){if(tissueMachine->getCount()>0){tissueMachine->setState ( (4) );}else{tissueMachine->setState( (5) );}}//其余代码省略

4.阅读以下说明和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和DocExplorer,当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态,现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图6-1所示。 ”相关问题
  • 第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题:

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

    【说明】

    某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都

    有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌

    灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式

    的类图如图5-1所示。

    【c++代码】

    }


    正确答案:
    本题考查命令(Command)模式的基本概念和应用。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者之间通常呈现一种紧耦合的关系。但在某些场合,比如要对行为进行记录撤销重做事务等处理,这种无法抵御变化的紧耦合是不合适的。这种情况下,使用Command模式将行为请求者与行为实现者进行解耦。题目中给出了Command模式的类图,其中:Command类为所有命令声明了一个接口。调用命令对象的execute()方法,就可以让接收者进行相关的动作。ConcreteCommand类定义了动作和接收者之间的绑定关系。调用者只要调用execute()就可以发出请求,然后由ConcreteCommand调用接收者的一个或多个动作。Invoker持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。Receiver知道如何进行必要的工作,实现这个请求。任何类都可以当接收者。了解了Command模式的内涵之后,下面来看程序。由于Command类的主要作用是为所有的ConcreteCommand定义统一的接口,在c++中通常采用抽象类来实现。C++的抽象类是至少具有一个纯虚拟函数的类。本题中的接口就是execute()方法,所以(1)处要求填写的是纯虚拟函数cxecute的定义方式,即vifrualvoidexecute()=0。类LightOnCammand、LightOfiCommand对应的就是模式中的ConcreteCommand;ConcreteCommand中execute()方法的代码在类图中已经给出,现在需要确定recelver是谁。类Light充当的是Receiver,其中定义了两种action:on和off.所以(2)、(3)对应代码分别为light->on()、light->off()。类RemoteControl对应的是模式中的Invoker,在该类中设置需要控制的命令对象。(4)处对应的代码为onCommands[slot],设置“开灯”命令对象;(5)处对应的代码为affcommands[slot].设置‘关灯”命令对象。类RemoteControl中的方法onButtanWasPushed和offlButtonWasPushed,分别完成对开灯、关灯命令对象的execute方法的调用,所以(6)、(7)处分别对应代码onCommands[slot]->execute()、offCommands[slot]->execute()。试题五参考答案(1)virtualvoidexecute()=0(2)light->on()(3)light->off()(4)onCommands[slot](5)offCommands[slot](6)onCommands[slot]->execute()(7)offCommands[slot]->execute()

  • 第5题:

    ●试题一

    阅读下列说明和流程图,将应填入(n)的字句写在答题纸的对应栏内。

    【说明】

    下列流程图(如图4所示)用泰勒(Taylor)展开式

    sinx=x-x3/3!+x5/5!-x7/7!+…+(-1)n×x 2n+1/(2n+1)!+…

    【流程图】

    图4

    计算并打印sinx的近似值。其中用ε(>0)表示误差要求。


    正确答案:
    ●试题一【答案】(1)x*x(2)x->t(3)|t|∶ε(4)s+2->s(5)(-1)*t*x2/(s*(s-1))【解析】该题的关键是搞清楚几个变量的含义。很显然变量t是用来保存多项式各项的值,变量s和变量x2的作用是什么呢?从流程图的功能上看,需要计算1!、3!、5!,……,又从变量s的初值置为1可知,变量s主要用来计算这此数的阶乘的,但没有其他变量用于整数自增,这样就以判断s用来存储奇数的,即s值依次为1、3、5,……。但x2的功能还不明确,现在可以不用管它。(2)空的作用是给t赋初值,即给它多项式的第一项,因此应填写"x->t"。(3)空处需填写循环条件,显然当t的绝对值小于ε(>0)就表示已经达到误差要求,因此(3)空应填入"|t|∶ε"。由变量s的功能可知,(4)空应当实现变量s的增加,因此(4)空应填入"s+2->s"。(5)空应当是求多项式下一项的值,根据多项式连续两项的关系可知,当前一项为t时,后一项的值为(-1)*t*x*x/(s*(s-1))。但这样的话,每次循环都需要计算一次x*x,计算效率受到影响,联想到变量x2还没用,这时就可以判断x2就是用来存储x*x的值,使得每次循环者少进行一次乘法运算。因此(1)空处应填入"x*x",(5)空处应填入"(-1)*t*x2/(s*(s-1))"。

  • 第6题:

    试题六(共15分)

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

    【说明】

    某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图6-1所示。

    采用状态( State)模式来实现该纸巾售卖机,得到如图6-2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图6-1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。

    【Java代码】

    import j ava.util.*;

    interface State{

    public void insertQuarter(); //投币

    public void ejectQuarter(); //退币

    public void turnCrank();腑安下“出纸巾”按钮

    public void dispense(); //出纸巾

    }

    class TissueMachine {

    ( 1 ) soldOutState, noQuarterState, hasQuarterState, soldState, state;

    state = soldOutState;

    int count = 0; //纸巾数

    public TissueMachine(intnumbers) { /*实现代码省略 */}

    public StategetHasQuarterState() { returnhasQuarterState; }

    public StategetNoQuarterState() { returnnoQuarterState, }

    public State getSoldState() { return soldState; }

    public State getSoldOutState() { return soldOutState; }

    public int getCount() { return count, }

    //其余代码省略

    }

    class NoQuarterState implements State {

    TissueMachine tissueMachine;

    public void insertQuarter() {

    tissueMachine.setState( (2));

    }

    //构造方法以及其余代码省略

    }

    class HasQuarterState implements State {

    TissueMachine tissueMachine;

    public void ejectQuarter() {

    tissueMachine.setState ((3));

    }

    //构造方法以及其余代码省略

    }

    class SoldState implements State {

    TissueMachine tissueMachine;

    public void dispense() {

    if(tissueMachine.getCount() > 0) {

    tissueMachine.setState ((4));

    } else {

    tissueMachine.setState ((5)); }

    }

    }


    正确答案:
    (1) State
    或 private State
    或 public State
    (2) tissueMachine.getHasQuarterState()
    或tissueMachine.HasQuarterState()
    或new HasQuarterState()
    (3) tissueMachine.getNoQuarterState()
    或tissueMachine.NoQuarterState()
    或new NoQuarterState()
    (4) tissueMachine.getNoQuarterState()
    或tissueMachine.NoQuarterState()
    或new NoQuarterState()
    (5) tissueMachine.getSoldOutState()
    或tissueMachine.SoldOutState()
    或new SoldOutState()

  • 第7题:

    阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图5-1所示。

    现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图5-2所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图5-1中的甜点菜单。类MenuItem表示菜单中的菜式。


    答案:
    解析:
    (1) abstract class或public abstract class(2) public abstract void add (MenuComponent menuComponent)或abstract void add (MenuComponent menuComponent)或protected abstract void add (MenuComponent menuComponent)(3) add (menuComponent)(4) menuComponent.print ()(5) allMenus.print ()

  • 第8题:

    阅读下列说明和C++-代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某发票(lnvoice)由抬头(Head)部分、正文部分和脚注(Foot)部分构成。现采用装饰(Decorator)模式实现打印发票的功能,得到如图5-1所示的类图。

    【C++代码】 #include using namespace std; class invoice{ public: (1){ cout<<"This is the content of the invoice!"<

    答案:
    解析:
    (1) virtual void printInvoice() (2) ticket->printInvoice() (3) Decorator::printInvoice() (4) Decorator::printInvoice() (5) &a
    【解析】

    试题分析
    1.Invoice类下,义虛函数,按类图,函数名是printInvoice
    2.前面定义对象名是ticket,那么在ticket不为空的时候调用函数printInvoice
    3.这部分填写发票的抬头,看类图应该实现函数printInvoice ,Decorator装饰模式使用该方法
    4.这部分是发票的脚注,看类图应该实现函数printlnvoice,Decorator装饰模式使用该方法
    5.FootDecorator a(NULL) ;脚步的装饰参数是a,调用a参数,

  • 第9题:

    阅读下列说明,回答问题1和问题2,将解答写在答题纸的对应栏内。
    【说明】
    Windows 系统的用户管理配置中,有多项安全设置,如图2-1 所示。





    答案:
    解析:
    【问题1】(3分)属于账号策略。 账户策略主要包括密码策略和账户锁定策略两种安全设置。
    【问题 2】(3分)Abcd321 test123! 123@host 密码必须符合复杂性要求:启用此策略,用户账户使用的密码必须符合复杂性的要求。 密码复杂性必须符合下列最低要求: 不能包含用户的账户名; 不能包含用户姓名中超过两个连续字符的部分; 至少有六个字符长; 密码总必须包含一下4类字符中的三类字符: 1、英文大写字母(A-Z) 2、英文小写字母(a-z) 3、10个基本数字(0-9) 4、特殊符号(!@#¥%等)

  • 第10题:

    阅读下列说明和 Java 代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上 留 下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy) 设 计模式来实现该需求,所设计的类图如图 5-1 所示。




    答案:
    解析:
    1.void stop()2.BrakeBehavior3.wheel.stop()4.wheel=behavior5.brake()

  • 第11题:

    阅读下列说明和C++代码,回答问题,将解答填入答题纸的对应栏内。
    【说明】
    某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式的类图如下图所示。



    Command?模式类图




    答案:
    解析:
    (1)interface Command
    (2)light.on()
    (3)light.off()
    (4)onCommands[slot]
    (5)offCommands[slot]
    (6)onCommands[slot].execute()
    (7)offCommands[slot].execute()

  • 第12题:

    阅读下列说明和?C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    阅读下列说明和?Java代码,将应填入?(n)?处的字句写在答题纸的对应栏内。
    【说明】
    某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种
    类可能不同,但其制作过程相同。前台服务员?(Waiter)?调度厨师制作套餐。现采用生成器?(Builder)?模式实现制作过程,得到如图?6-1?所示的类图。






    答案:
    解析:

  • 第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 2代码,将应填入(n)处的字句写在对应栏内。

    [说明]

    以下程序为类类型的变量应用实例,通过异常处理检验了类CCircle的变量的合法性,即参数半径应为非负值。仔细阅读代码和相关注释,将程序补充完整。

    [JAVA代码]

    //定义自己的异常类

    class CCircleException extends Exception

    {

    }

    // 定义类 CCircle

    class CCircle

    {

    private double radius;

    public void setRadius ( double r ) (1)

    {

    if ( r<0 ) {

    (2)

    }

    else

    (3)

    }

    Public void show ( ) {

    System. out. println ( "area="+3.14*radius*radius );

    }

    }

    public class ciusample

    {

    public static void main ( String args[] )

    {

    CCircle cir=new CCircle( );

    (4) {

    cir. setRadius ( -2.0 )

    }

    (5)

    {

    System. out. println ( e+" throwed" ) ;

    }

    cir. show( ) ;

    }

    }


    正确答案:(1)throws CCircleException (2)throw new CCircleException(); //抛出异常 (3)radius=r; (4)try (5)catch(CCircleException e) //捕捉由setRadius()抛出的异常
    (1)throws CCircleException (2)throw new CCircleException(); //抛出异常 (3)radius=r; (4)try (5)catch(CCircleException e) //捕捉由setRadius()抛出的异常 解析:本题主要考查JAVA语言中Class类型的变量应用。本段代码中对于类Ccircle的半径变量进行合法性检验,如果圆Ccircle的半径为负值,则抛出异常处理。

  • 第15题:

    阅读下列说明和Java代码,将应填入 (n)处的字句卸载答题纸的对应栏内. 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新。 现在采用观察者(Observer)模式来开发该系统。观察者模式的类图如图6-1所示。

    【Java代码】 import java.util.*; interface Observer { public void update(float temp, float humidity, float cleanness); } interface Subject { public void registerObserver(Observer o); //注册对主题感兴趣的观察者 public void removeObserver(Observer o); //删除观察者 public void notifyObservers(); //当主题发生变化时通知观察者 } class EnvironmentData implements (1) { private ArrayList observers; private float temperature, humidity, cleanness; public EnvironmentData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { /* 代码省略 */ } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); (2) ; } } public void measurementsChanged() { (3) ; } public void setMeasurements(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; (4) ; } } class CurrentConditionsDisplay implements (5) { private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData) { this.envData = envData; (6) ; } public void update(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; display(); } public void display() {/* 代码省略 */ } } class EnvironmentMonitor{ public static void main(String[] args) { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay currentDisplay = new CnrrentConditionsDisplay(envData); envData.setMeasurements(80, 65, 30.4f); } }


    正确答案:

    (1)Subject
    (2)observer.update(temperature,humidity,cleanness)
    (3)notifyObservers()
    (4)measurementsChanged()
    (5)Observer
    (6)envData.registerObserver(this)


  • 第16题:

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

    【说明】

    某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都

    有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌

    灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。command模式

    的类图如图6-1所示。

    【Java代码】

    }


    正确答案:
    本题考查命令(Command)模式的基本概念和应用。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者之间通常呈现一种紧耦合的关系。但在某些场合,比如要对行为进行记录撤销重做事务等处理,这种无法抵御变化的紧耦合是不合适的。这种情况下,使用command模式将行为请求者与行为实现者进行解耦。题目中给出了Lommamt模式的类图,其中:Command类为所有命令声明了一个接口。调用命令对象的execute()方法,就可以让接收者进行相关的动作。ConcreteCommand类定义了动作和接收者之间的绑定关系。调用者只要调用execute()就可以发出请求,然后由ConcreteCommand调用接收者的一个或多个动作。Invoker持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。Receiver知道如何进行必要的工作,实现这个请求。任何类都可以当接收者。了解了Command模式的内涵之后,下面来看程序。由于Command类的主要作用是为所有的ConcreteCommand定义统一的接口,在Java中通常采用接口(interface)来实现,所以(1)处对应的代码为interfaceCommand。类LightOnCommand、LightOffCommand对应的就是模式中的ConcreteCommand。ConcreteCommand中execute()方法的代码在类图中已经给出,现在需要确定receiver是谁。类Light充当的是Receiver.其中定义了两种action:on和off.所以(2)、(3)对应代码分别为light.on()和light.off()。类RemoteControl对应的是模式中的Invoker,在该类中设置需要控制的命令对象。(4)处对应的代码为onCammands[slot],设置“开灯”命令对象:(5)处对应的代码为offCommands[slot],设置‘关灯”命令对象。类RemoteControl中的方法onButtonWasPushed和ofiButtonWasPushed,分别完成对开灯、关灯命令对象的execute方法的调用。所以(6)、(7)处分别对应代码onCommands[slot].execute()、offCommands[slot].execute()。试题六参考答案(1)interfaceCommand(2)light.on()(3)light.off()(4)onCommands[slot](5)offi:ommands[slot](6)onCommands[slot].execute()(7)ofiCommands[slot].execute()

  • 第17题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第18题:

    图6-1是下一代网络的体系结构简图,请根据此简图将应填入(n)处的字句写在答题纸的对应栏内。


    正确答案:
    (1)业务平面
    (2)控制平面
    (3)传输平面
    (4)接入平面
    (5)SIP-TBICC
    (6)SIGTRAN
    (7)MGCP/H.248
    (8)H.323
    (9)SIP

  • 第19题:

    阅读下列说明和 C ++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留 下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy)设计模式来实现该需求,所设计的类图如图 6-1 所示。

    【C++ 代码】#includeusing namespace std;class BrakeBehavior{public:(1) ; /*其余代码省略*/};class LongWheelBrake : public BrakeBehavior{public:void stop(){cout <<"模拟长轮胎刹车痕迹! "<< end1;} /*其余代码省略*/};class ShortWheelBrake : public BrakeBehavior{public:void stop(){cout<"模拟短轮胎刹车痕迹! "<< end1;} /*其余代码省略*/};class Car{protected: (2) wheel;public:void brake(){ (3) ; } /*其余代码省略*/};class ShortWheelCar : public Car{public:ShortWheelCar(BrakeBehavior* behavior){ (4);} /*其余代码省略*/};int main(){BrakeBehavior* brake= new ShortWheelBrake();ShortWheelCar car1(brake):car1. (5) ;return 0;}


    答案:
    解析:
    1. virtual void stop( )=02. BrakeBehavior*3. Wheel->stop( )4. wheel=behavior5. brake( )

  • 第20题:

    阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留 下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy)设计模式来实现该需求,所设计的类图如图 5-1 所示。

    【Java代码】import java.util.*; interface BrakeBehavior{public (1) ;/*其余代码省略*/}class LongWheelBrake implements BrakeBehavior{public void stop(){System.out.println("模拟长轮胎刹车痕迹! ");}/*其余代码省略*/}class ShortWheelBrake implements BrakeBehavior {public void stop(){System.out.println("模拟短轮胎刹车痕迹! ");}/*其余代码省略 */}abstract class Car{protected (2) wheel;public void brake(){ (3) ;}/*其余代码省略*/}class ShortWheelCar extends Car {public ShortWheelCar(BrakeBehavior behavior){(4) ; } /*其余代码省略*/}class StrategyTest{public static void main(String[]args){BrakeBehaviorbrake =new ShortWheelBrake();ShortWheelCar car1= new ShortWheelCar(brake);car1. (5) ;}}


    答案:
    解析:
    1. void stop()2. BrakeBehavior3. wheel.stop()4. wheel=behavior5. brake()

  • 第21题:

    阅读下列说明和C++代码,回答问题,将解答填入答题纸的对应栏内。
    【说明】某航空公司的会员积分系统将其会员划分为:普卡 (Basic)、银卡(Silver)和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积 的里程数进行调整。描述会员等级调整的状态图如图 5-1 所示。现采用状态 (State) 模式实现上述场景,得到如图 5-2 所示的类图。




    【问题1】(15分)阅读上述说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。


    答案:
    解析:
    注意:原版的题目应该是Cbasic、CSilve。(1) virtual double travel(int miles,FrequentFlyer* context)=0(2)context->setState(context->Cbasic)(3)context->setState(context->CSilve)(4)context->setState(context->Cbasic)(5)context->setState(context->CSilve)

  • 第22题:

    阅读下列说明和C++代码,将应填入
    (n)
    处的字句写在答题纸的对应栏内。
    【说明】
      某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表5-1所示。表5-1



     为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图5-1所示。



    图5-1中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。 【C++ 代码】 #include


    答案:
    解析:
    (1)FlyBehavior*flyBehavior      
    (2)TakeOffBehavior*takeOffBehavior

  • 第23题:

    阅读下列说明和 Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银卡(Silver)和金卡 (Gold)三个等级。非会员 (NonMember)可以申请成为普卡会员。会员的等级根据其 一年内累积的里程数进行调整。描述会员等级调整的状态图如图 6-1 所示 。现采用状态 (State) 模式实现上述场景,得到如图 6-2 所示的类图。






    答案:
    解析:
    (1)abstract double travel(int miles,FrequentFlyer context)(2)context.setState(new CSilver())(3)context.setState(new C Gold ())(4)context.setState(new CSilver())(5)context.setState(new C Basic ())