首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读下列说明与相关类图,填空并回答问题。 【说明】 装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。 例如,一个名叫星巴兹(Starbuzz)的咖啡连锁
阅读下列说明与相关类图,填空并回答问题。 【说明】 装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。 例如,一个名叫星巴兹(Starbuzz)的咖啡连锁
admin
2010-01-15
55
问题
阅读下列说明与相关类图,填空并回答问题。
【说明】
装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。
例如,一个名叫星巴兹(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(){
returnbeverage. getDescription()+",Soy";
}
public double cost(){
return.15+beverage.cost();
}
}
class Whip extends CondimentDecorator{
Beverage beveragei
public Whip(Beverage beverage) {
this.beverage=beverage;
}
public String getDescrlption(){
returnbeverage. getDescription()+", Whip";
}
public double cost(){
return.10+beverage.cost();
}
}
class Milk extends CondlmentDecorator{
Beverlige beverage;
public Milk(Beverage beverage) {
this. beverage=beverage;
}
public String getDescription(){
return beverage.getDescription()+", Milk";
}
public double cost(){
return.10+beverage.cost();
}
}
public class StarbuzzCoffee{
public static void main(Stting args[]){
//订一杯Espresso咖啡,不需要任何调料,打印出它的描述和价钱
Beverage beverage=new Espresso();
System.out.println(beverage.getDescription()+"$"+beverage.cost());
//订一杯加了两份Macha调料、一份Whip调料的DarkRoast咖啡
//并打印出它的描述和价钱
Beverage beverage2=new DarkRoast();
beverage2=new Mocha(beverage2):
beverage2=new (4) (beverage2);
beverage2=new Whip(beverage2);
System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
//订一杯加了一份Soy调料、一份Mocha调料、一份Whip调料
//的HouseBlend咖啡,并打印出它的描述和价钱
Beverage beverage3=new HouseBlend();
beverage3=new Soy(beverage3);
beverage3=new Mocha(beverage3);
beverage3=new Whip(beverage3);
System.out.println(beverage3.getDescription()+"$"+beverage3.cost());
}
}
【问题1】
根据题目叙述,请将上述Java程序代码13-6中的(1)~(4)空填充完整。
【问题2】
请写出上述程序的输出结果。
选项
答案
[问题1] (1)abstract (2)extends (3)beverage (4)Mocha [问题2] 执行题目的程序代码,得到的输出结果为: Espresso $1.99 Dark Roast Coffee, Mocha, Mocha, Whip $1.49 House Blend Coffee, Soy, Mocha, Whip $1.34
解析
装饰者(Decorator)模式动态地给一个对象添加一些额外的职责。Decorator意为装饰
者、油漆工,译成后者更为形象。所谓的“油漆工”,就是将被装饰者对象“粉刷或油漆”上相应的功能。题目举了一个咖啡馆设计咖啡的例子,若采用普通继承的方式将引起所谓的“类数量爆炸”现象,因为当基本咖啡种类和调料种类很多时,它们的组合种类会非常多,不利于代码的维护。
在装饰者模式中,装饰者和被装饰者必须是同一类型,亦即它们具有共同的超类,这里利用继承达到“类型匹配”的目的,而不是利用继承获得“行为”。当将装饰者和被装饰者的组件组合时就加入了新的行为,所得到的新行为并不是继承自超类,而是由组合对象得来的。使用该方式可以将所有饮料和调料更有弹性地加以混合与匹配。
根据类图13—25很容易将程序填充完整。该类图遵循UML标准,类名用斜体表示的类表示其是抽象类,方法名用斜体表示的方法代表其是抽象方法。饮料类Beverage是抽象类,因此,第(1)空填abstract。从类图可知,装饰者抽象类CondimentDecorator也从饮料类Beverage继承而来,这使得装饰者和被装饰者是同一类型,亦即它们具有共同的超类 Beverage,所以第(2)空应填extends。注意,不要丢了最后一个字母s,否则可能会被扣分。
Decal、Espresso、HouseBlend和DarkRoast四类基本咖啡都从Beverage类继承而来,在其cost()方法中直接返回该种咖啡的价钱,不必考虑调料的价钱。Mocha、Soy、Whip、 Milk四种调料都继承了CondimentDecorator类,它们都拥有一个实例变量beverage,用来记录被装饰的饮料,即将被装饰的饮料作为构造器的参数,再由构造器将此饮料记录在变量中,对应语句“this.beverage=beverage;”,this表示本类对象的引用,其后带了beverage,表明该类有一个名为beverage的变量,所以第(3)空填beverage。
在这四种调料的cost()方法中,要计算相应的加了该种调料的饮料的总价钱,只要将原基本饮料的价钱加上该种调料的价钱即可。例如,加了Mocha调料的饮料的总价钱为“0.20+beverage.cost();”,其中0.20是Mocha调料的价钱。
当用某种调料来装饰某种基本饮料时,只要将饮料作为参数构造该种调料对象即可。例如,当顾客要订一杯加了两份Macha调料、一份Whip调料的DarkRoast咖啡时,先用 Mocha对象装饰(包装、包裹、油漆)它,即beverage2=newMocha(beverage2);,然后再进行一次装饰,所以第(4)空应填Mocha。
该段程序输出的结果很简单,即求各种具体咖啡的价钱——只要将调料和基本咖啡的价钱相加即可。
转载请注明原文地址:https://kaotiyun.com/show/BcDZ777K
本试题收录于:
软件设计师下午应用技术考试题库软考中级分类
0
软件设计师下午应用技术考试
软考中级
相关试题推荐
下列关于软件开发的叙述中,与提高软件可移植性相关的是(19)。
计算机的用途不同,对其部件的性能指标要求也有所不同。以科学计算为主的计算机,对(1)要求较高,而且应该重点考虑(2)。
以下用例图中,A1和A2为(47)。A1和A2的关系为(48)。(48)
模块A、B和C都包含相同的5个语句,这些语句之间没有联系,为了避免重复,把这5个语句抽取出来组成一个模块D,则模块D的内聚类型为(39)内聚。以下关于该类内聚的叙述中,不正确的是(40)。(39)
某公司采用的软件开发过程通过了CMM2认证,表明该公司(30)。
以下关于功能测试用例的意义的叙述,正确的是(38)。①避免盲目测试并提高测试效率②令软件测试的实施重点突出、目的明确③在回归测试中无需修正测试用例便可继续开展测试工作④测试用例的通用化和复用化使软件测试易于开展
对高级语言源程序进行编译时,可发现源程序中的(21)错误。
假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为10μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的Docl文件逐块从磁盘读入缓冲区,并送至用户区进行处理,那么采用单缓冲区需要花费的时间
假设某公司营销系统有营销点关系S(营销点,负责人姓名,联系方式)、商品关系P(商品名,条形码,型号,产地,数量,价格),其中,营销点唯一标识S中的每一个元组。每个营销点可以销售多种商品,每一种商品可以由不同的营销点销售。关系S和P的主键分别为(15),S
银行系统数据流图中,某个加工根据客户的多个不同属性的值来执行不同的操作,则对该加工最适宜采用()描述。
随机试题
事物的个别属性在人脑中的反映是
A.柴胡B.荆芥C.升麻D.防风既能发表散风,又能透疹,消疮,止血的是
A.晨尿B.随机尿C.尿三杯试验D.甲醛E.甲苯多用于男性下尿路及生殖系统疾病定位初步判断的是
寒饮咳喘,痰多清稀。宜选用寒凝瘀滞,经闭、痛经。宜选用
走出适合本国发展的现代化道路,不能盲人摸象,也不能孤芳自赏,而是要站在理论制高点和道义制高点上________,以资本主义现代化模式为鉴,以历史潮流为据,以造福于本国和世界人民为________去不断开创。填入画横线部分最恰当的一项是:
关于公路隧道特点的描述,不正确的选项是()。
关于法的效力层级的说法,下列选项中正确的是()。
检验检疫机构签发的证单一般以验讫日期作为签发日期。( )
根据实验在教学中的作用分类,可分为()。①演示实验;②并进实验;③学生实验;④描述实验;⑤实验习题;⑥投影实验
Weshould______(提倡顾全大局).
最新回复
(
0
)