阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某发票(lnvoice)由抬头(Head)部分、正文部分和脚注(Foot)部分构成。现采用装饰(Decorator)模式实现打印发票的功能,得到如图6-1所示的类图。
【java代码】classinvoice{publicvoidprintInvoice(){:System.out.println("Thisisthecontentoftheinvoice!");}}classDecorator:extendsInvoice{protectedInvoiceticket;publicDecorator(lnvoicet){ticket=t;}publicvoidprintinvoice(){if(ticket!=NULL)(1);}}classFootDecoratorextendsDecorator{publicFootDecorator(lnvoicet){super(t);}publicvoidprintinvoice(){Systent.out.println("Thisistheheaderoftheinvoice!");(2);}}classFootDecoratorextendsDecorator{publicFootDecorator(invoicet):{super(t);}publicvoidprintlnvoice(){(3);Systent.out.println("Thisistheheaderoftheinvoice!");}}Classtest{publicstaticvoidmain(string[]args){Invoicet=newinvioce();Invoiceticket;Ticket=(4);Ticket.Printinvoice();Systent.out.println(“--------------“)Ticket=(5);Ticket.Printinvoice();}}程序的输出结果为:Thisistheheaderoftheinvoice!Thisisthecontentoftheinvoice!Thisisthefootnoteoftheinvoice!----------------------------Thisistheheaderoftheinvoice!Thisisthefootnoteoftheinvoice!
(1) ticket.printInvoice() (2) ticket.printInvoice() (3) ticket.printInvoice() (4) new FootDecorator(new HeadDecorator(t)) (5) new FootDecorator(new HeadDecorator(new Decorator(null))) 【解析】 试题分析 本题考查的是面向对象程序设计和设计模式。本题涉及的设计模式是装饰模式。装饰模式(Decorator) :动态地给一个对象添加一些额外的职责。它提供了用子类打展功能的一个灵活的替代,比派生一个子类更加灵活。 对于程序填空可以参照代码上下文、题干说明和设计模式综合考虑。 对于第(1) 空,是对printInvoice方法的具体调用,在Decorator是 装饰类,继承了Invoice发票类。此处需要填写的是printInvoice方法的方法体,根据Decorator类的上下文,已定义ticket对象,所以此处调用printinvoice方法的是ticket,第(1) 空填写ticket printlnvoice()。 对于第(2) (3) 空,根据类图可知,分别是HeadDecorator抬头 类、FootDecorator脚注类调用printInvoice方法的方法体,由于在这两个类中并没有定义属性,只有借助其超类的构造函数,所以这两个地方调用printlnvoice方法的是它们的超类,即(2) (3) 填写的是super.printInvoice()。 对于第(4) (5) 空,考查的是对装饰模式的调用,都是main函数中实例化的过程,根据输出结果可以看到,第(4)空实例化ticket对象,可以输出抬头、内容、脚注3个部分, 因此需要调用三者的printInvoice()方法, 前面已经实例化了一个Invoice对象t,可以利用给子类实例化,因此第(4) 空填写new HeadDecorator(new FootDecorator());而第(5)空没有输出具体内容,只有抬头和脚注部分,可以看到这里的Invoice对象应该是空,所以第(5) 空填写new HeadDecorator(new FootDecorator(nl)。