第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(){
第2题
阅读以下说明和Java代码,将应填入(n)处的字句写在对应栏内。
【说明】
某绘图系统存在point、line、square三种图元,它们具有Shape接口,图元的类图关系如图13-12所示。现要将circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由 Shape派生而来的,它提供的接口不能被系统直接使用。代码13-2既使用了XCircle又遵循了Shape规定的接口,既避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。代码13-3根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与XCircle提供的显示接口及其功能如表13-5所示。
【代码13-2】
class Circle (1) {
private (2) pxc;
public Circle(){
pxc=new (3);
}
public void display(){
pxc. (4);
}
}
【代码13-3】
public class Factory{
public (5) getShape Instance(int tyoe){ //生成特定类实例
switch(type){
case 0: return new point();
case 1: return new Rectangle();
case 2: return new line();
case 3: return new Circle();
default: return null
}
}
};
public class App{
public static viod main(String argv[]){
if(argv. length!=1){
system. out. println("error parameters!");
Return;
}
int type=(new Integer(argv[0])). intValue();
Factory factory=new Factory();
shape s;
s=factory. (6);
if(s==null){
system.out. println("Error get instance!");
Return;
}
s.display();
return;
}
}
第3题
阅读以下说明,回答问题1、问题2和问题3。
【说明】
某单位正在使用一套C/S模式的应用软件系统,现在需要升级为B/S应用模式,但需要保持业务的连续性。开发人员提出用Web Service作为中间层的接口进行开发。
【问题1】
请用120字以内文字,从业务的继承性、升级成本(时间、工作量)和扩展性三个方面简要说明开发人员所提方案的优点。
【问题2】
Web Service的三个基本技术是WSDL、SOAP、UDDI,它们都是以XML为基础定义的。请用120字以内文字,简要说明WSDL、SOAP和UDDI的作用。
【问题3】
服务注册中心、服务提供者和服务请求者之间的交互和操作构成了Web Service的体系结构,如图13-21所示。请用180字以内文字,说明这三者的主要功能及其交互过程。
第4题
阅读以下某人才信息交流网数据库设计的技术说明和图,根据要求回答问题1~问题5。
[说明]
某市人才交流中心为促进当地人力资源的合理配置,加强当地企业与人才的沟通,拟建立人才信息交流网。
[需求分析结果]
1.每个前来登记的个人需填写《人才入库登记表》,如表2-17所示,并出示相关证件,经工作人员审核后录入个人信息。
2.每个前来登记的企业需填写《企业信息登记表》,如表2-18所示,并出示相关证明及复印件,经工作人员核实后录入企业信息。
3.个人和企业的基本信息只需在第一次登记时填写,个人编号和企业编号由系统自动生成。个人和企业的基本信息由计算机长期存储,以后个人只需提供个人编号和求职意向信息,企业只需提供企业编号和岗位需求信息。
4.个人的求职意向信息和企业的岗位需求信息在两个工作日内由工作人员录入数据库并发布。
[概念模型设计]
根据需求阶段收集的信息,设计人才、岗位和企业的实体联系图如图2-24所示(不完整)。
[逻辑结构设计]
1.将概念模型设计的实体联系图转换为以下关系模式
人才(个人编号,姓名,性别,出生日期,身份证号,毕业院校,专业,学历,证书名称,证书编号,联系电话,电子邮件,个人简历及特长)
企业(企业编号,企业名称,联系人,联系电话,地址,企业网址,电子邮件,企业简介)
求职意向( (2) )
岗位需求( (3) )
2.由于一个人可能持有多个证书,因此对“人才”关系模式进行优化,得到如下两个新的关系模式
人才( (4) )
证书( (5) )
根据上述的设计过程,回答以下问题。
在(1)空缺处填入所需的实体、联系及其属性,完成概念模型设计。
第5题
写完整。
查询请求信息=[查询读者请求信息|查询图书请求信息]
读者情况=读者号+姓名+所在单位+{借书情况} 管理工作请求单=(1)
入库单=(2) 借书单:(3)
还书单=(4) 非法请求信息=(5)
第6题
阅读下列Java程序和程序说明,将应填入(n)处的字句写在对应栏内。
【说明】本程序ExceptionTester实现功能:读入两个整数,第1个数除以第2个数,之后输出。若第2个数为0,则自动进行异常处理。
程序如下:
(1);
public class ExceptionTester{
public static void main(String args[]){
int result;
int number[]=new int[2];
boolean valid;
for(int i=0;i<2;i++){
valid=(2);
while(!valid){
try{
System.out.println("Enter number"+(i+1));
number[i]=Integer.valueOf(Keyboard.getString()).intValue();
valid=true;
}catch(NumberFormatExceptione){
System.out.println("Invalid integer entered.Please try again.");
}
}
}
by{
result=number[0]/number[1];
System.out.print(number[0]+"/"+number[1]+"="+result);
}catch((3)){
System.out.println("Second number is 0,cannot do division!");
}
}
}
其中,Keyboard类的声明为:
impon java.io.*;
public class Keyboard{
static BufferedReader inputStream=new (4)
(new InputStreamReader(System.in));
public static int getInteger(){
try{
return(Integer,valueOf(inputStream.readLlne().trim()).intValue());
}catch(Exceptione){
e.printStackTrace();
return 0;
}
}
public (5) {
by{
return(inputStream.readLine());
} catch(IOExceptione)
{return "0";}
}
}
第8题
阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如6—8所示:
【Java代码】
import JavA.util.ArrayList;
import JavA.util.List;(1)class AbstractFile{
protected String name;
public void printName(){System.out.println(name);}
public abstract boolean addChild(AbstractFile file);
public abstract boolean removeChild(AbstractFile file);
public abstract ListgetChildren {};
}
class File extends AbstractFile{
public File(String name)(this.name=name;}
public boolean addChild(AbstractFile file){return false;}
public boolean removeChild(AbstractFile file){return false;}
public ListgetChildren(){return (2) ;)
}
clasS Folder extends AbstractFile{
private ListchildList;
public Folder(String name){
thiS.name=name;
this.childList=new ArrayList{};
}
public boolean addChild(AbstractFile file){return childList.add(file);}
public boolean removeChild(AbstractFile file){return childList.remove(file);
public (3)getChildren(){return (4) ;)
}
public class Client{
public static void main(String[]args){
//构造一个树形的文件/目录结构
AbstractFile rootFolder=new Folder(“C:\”’);
AbstractFile compositeFolder=new Folder(”composite”);
AbstractFile windowsFolder=new Folder(”windows”);
AbstractFile file=new File(”TestComposite.java”);
rootFOlder.addChild (compositeFolder);
rootFolder.addChiid(windowsFolder);
compositeFolder.addChild(file);
//打印目录文件树
printTree(rootFolder);
}
private static void printTree(AbstractFile ifile){
ifile.PrIntName();
Listchildren:ifile.getChildren ();
if(chiidren==null)return;
for(AbstractFile file:children){(5) ;
}
}
}
该程序运行后输出结果为:
C:\
composite
TestComposite.java
Windows
第9题
阅读下列说明和uML图,回答问题l至问题4,将解答填入答题纸的对应栏内。
【说明】
某企业为了方便员工用餐,为餐厅开发了一个订餐系统(COS:Cafeteria Ordering system),企业员工可通过企业内联网使用该系统。
企业的任何员工都可以查看菜单和今日特价。系统的顾客是注册到系统的员工,可以订餐(如果未登录,需先登录)、注册工资支付、预约规律的订餐,在特殊情况下可以覆盖预订。餐厅员工是特殊顾客,可以进行备餐、生成付费请求和请求送餐,其中对于注册工资支付的顾客生成付费请求并发送给工资系统。菜单管理员是餐厅特定员工,可以管理菜单。送餐员可以打印送餐说明,记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
顾客订餐过程如下:
1.顾客请求查看菜单; 2.系统显示菜单和今日特价;
3.顾客选菜; 4.系统显示订单和价格;
5.顾客确认订单;
6.系统显示可送餐时间;
7.顾客指定送餐时间、地点和支付方式;
8-系统确认接受订单,然后发送Email给顾客以确认订餐,同时发送相关订餐信息通知给餐厅员工。系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和一次订餐的活动图初稿分别如图6—4和图5—5所示。
根据【说明】中的描述,给出图6—4中A1和A2所对应的参与者。
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!