软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷36

0
收藏   分享
  • 卷面总分:75分
  • 试卷类型:模拟考试
  • 测试费用:免费
  • 答案解析:是
  • 练习次数:41次
  • 作答时间:150分钟
试卷简介
试卷预览
1

阅读下列说明与相关类图,填空并回答问题。

  【说明】

 装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。

 例如,一个名叫星巴兹(Starbuzz)的咖啡连锁店提供多种多样的咖啡,最朴素的设计就是采用继承,即设计一个饮料抽象基类Beverage,让不同种类的咖啡HouseBlend、 Decaf、Espresso、DarkRoast继承Beverage类,如图13-23所示。Beverage类的cost()方法是抽象方法,每个子类的cost()方法实现即返回具体咖啡种类的价钱,Beverage类的 description实例变量由每个子类设置,用来描述该类饮料,Beverage类的getDescription()方法用来返回此描述。

               

 客户在点咖啡时还可以要求添加各种各样的调料(Condiment),加入的调料不同所收取的费用也是不同的,让各种加了调料的不同咖啡都继承基类Beverage,当咖啡种类和调料种类很多时,组合种类的数量就会急剧增长,就会发生“类数量爆炸”现象,如图13-24所示。

             

 显然,采用这种设计方式会使得代码的维护变得十分困难,可以采用装饰者模式来解决这个问题。软件设计师蝴蝶飞根据装饰者模式的思想设计了如图13-25所示的类图。

              

 在图13-25中,将各种调料Milk、Mocha、Soy、Whip作为装饰者来装饰House- Blend、Decal、Espresso、DarkRoast等各种咖啡。下面的Java程序(代码13-6)对应其具体实现。

  【代码13-6】

 import java.io.* ;

 abstract class Beverage{

   String description="Unknown Beverage";

   public String getDescription(){

     return description;

    }

   public (1) double cost();

 }

 abstract class CondimentDecorator (2) Beverage {

   public abstract Strmg getDescription();

 }

 class Decafextends Beverage {

   public Decaf(){

     description="Decaf Coffee";

   }

   public double cost(){

     return 1.05;

   }

 }

 class Espresso extends Beverage {

   public Espresso() {

     description="Espresso";

   }

   public double cost(){

     return 1.99;

   }

 }

 class HouseBlend extends Beverage{

   public HouseBlend(){

     description="House Blend Coffee";

   }

   public double cost(){

     return.89;

   }

 }

 class DarkRoast extends Beverage{

   public DarkRoast(){

     description="Dark Roast Coffee";

   }

   public double cost(){

     return.99;

   }

 }

 class Mocha extends CondtmentDecorator{

   Beverage (3);

   public Mocha(Beverage beverage){

     this.beverage=beverage;

   }

   public String getDescription(){

     return beverage.getDescription()+", Mocha";

    }

   public double cost(){

     return.20+beverage.cost();

   }

 }

 Class Soy extends CondimentDecorator{

   Beverage beverage;

   public Soy(Beverage beverage) {

     this.beverage=beverage;

   }

   public Strillg getDescription(){

    

1

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

  【说明】

 一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如:图13-26所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。

            

 二叉树的结点类型定义如下:

 typedef struct BSTNode{

 int data;

 struct BSTNode * lch,* rch;//结点的左、右孩子指针

 } * BSTree;

 代码13-7中,函数BSTree Find_Del(BSTreeroot)的功能是:若root指向一棵二茶树的根结点,则找出该结点的右子树上的“最左下”结点*p,并从树中删除以*p为根

的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。

 【代码13-7】

 BSTree Find_Del(BSTree root)

 {

   BSTree p,pre;

   If(! root)  / * root指向的二叉树为空树*/

   return NULL;

    (1);  / * 令p指向根结点的右子树*/

   if( ! p)

     return NULL;

    (2);  / * 设置pre的初值*/

   while(p->lch) {/ * 查找“最左下”结点*/

     pre=p;

     p=(3);

   }

   if((4)==root) / * root的右子树根为“最左下”结点*/

     pre->rch=NULL;

   else

    (5)=NULL;/ * 删除以“最左下”结点为根的子树*/

   return p;

 }

1

阅读以下说明和C++程序代码,将程序填充完整。

  【说明】

 有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。

 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。

 装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。

          

 程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。

 【程序代码13-5】

  (1);

 class Window

 {

 public:

    roid SetContents (VisualComponent * contents);

 };

 //VisualComponent类是一个描述可视对象的抽象类

 class VisllalComponent

 {

 public:

   VisualComponent(){};

    (2) void Draw(){};

 Virtual void Resize(){};

 };

 class Decorator:public VisualComponent

 {

 public:

   Decorator()

   {

     //…

   };

   Decorator(VisualComponent * vcom)

   {

     //…

   };

   virtual vold Draw();

   virtual vold Resize();

 private:

   /* Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/

   VisualComponent (3) ;

 };

 vold Decorator::Draw()

 {

     (4);//缺省实现

 }

 void Decorator::Resize()

 {

   component->Resize();//缺省实现

 }

 //BorderDecorator 子类为它所包含的组件添加一个边框

 class BorderDecorator:public Decorator

 {

 public:

   BorderDecorator(VisualComponent * vcom,int borderWidth)

 {

   //…

    };

   Virtual Void Draw();

 private:

   void DrawBorder(int);

 private:

   int borderWidth;

 };

   void BorderDecorator::Draw()

 {

   Decorator::Draw();

   DrawBorder(_width);

 }

 Void BorderDecorator::DrawBorder(int Width)

 {

   //…

 )

 Void Window::SetConterlts(VlsualComponent * contents)

 {

   //…

 }

 //SerollDecorat 给可视组件添加滚动功能

 class ScroliDecoratOr:public Decorator

 {

 public:

   ScrollDecorator(VlsualComponent * vcom)

   {

     //…

   };

     //…

 );

 class TextView:public VisualComponent

 {

   //…

 };

 void main(void)

 {

   //创建一个正文视图以及放入这个正文视图的窗口

   Window * window=new Window;

   TcxtView * textView=new TextView;

    //TextView是一个VisualComponent,它可以放入窗口中

   window->SetContents(textView);

   //得到一个有边界的和可以滚动的TextView,边界宽为1

   window->SetContents((5));

 }