1. (填空题)某公司欲开发一套机房监控系统,如果机房达到某一指定温度,传感器将做出返应,将信号传递给响应设备,如警示灯闪烁、报警器将发出警报、安全逃生门将自动开启、隔热门将自动关闭等,每一种响应设备的行为由专门的程序来控制。为支持将来引入新类型的响应设备,采用观察者模式设计该系统,所得类图如下所示:
在图中,ThermoSensor是温度传感器,定义了增加响应设备的方法register()和触发方法trigger()。AlarmListener接口是抽象响应设备类,声明了警示方法alarm(),而警示灯类CautionLight、报警器类Annunciator和安全门类ExitGate是具体响应设备类,它们实现了警示方法alarm()。ExitGate是抽象类Gate类的子类,它将实现在Gate类中声明了open()方法和close()方法,用于开启逃生门并关闭隔热门,Gate类中的action()方法用于同时执行open()方法和close方法。
请完成以下Java代码中空的代码填写。
【Java代码】
import java.util.*;
____{
public vo
alarm();
}
abstract class Gate{
public void action(){
open();
close();
}
public abstract void open();
public abstract void close();
}
class CautionLight implements AlarmListener{
public void alarm(){
System.out.println("警示灯闪烁!");
}
}
class Annunciator implements AlarmListener{
public void alarm(){
System.out.println("报警器发出警报!");
}
}
class ExitGate ____{
public void alarm(){
____;
}
public void open(){
System.out.println("逃生门开启!");
}
public void close(){
System.out.println("隔热门关闭!");
}
}
class ThermoSensor{
private ArrayList arrayListeners = new ArrayList();
public void register(AlarmListener al){
____;
}
public void trigger(){
for(Object obj:arrayListeners){
____;
}
}
}
class Test{
public static void main(String[] args) {
AlarmListener light, annunciator,exitGate;
light = new CautionLight();
annunciator = new Annunciator();
exitGate = new ExitGate();
ThermoSensor sensor;
____;
sensor.register(light);
sensor.register(annunciator);
sensor.register(exitGate);
____; //触发警报
}
}
正确答案:
(1) interface AlarmListener
(2) extends Gate implements AlarmListener
(3) super.action()
(4) alarmListeners.add(a1)
(5) ((AlarmListener)obj).alarm()
(6) sensor=new ThermoSensor()
(7) sensor.trigger()
2. (填空题)传输门是传输系统中的重要装置。传输门具有Open(打开)、Close(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发状态的转换事件有click、complete和timeout三种,事件与其相应的状态转换如图所示:
下面Java代码1与Java代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。
请完成以下Java代码中(1)--(7)空的代码填写。
【Java代码】
Java 代码1如下:
public class Door{
public static final int CLOSED = 1;
public static final int OPENING = 2;
public static final int OPEN = 3;
public static final int CLOSING = 4;
public static final int STAYOPEN = 5;
private int state = CLOSED;
//定义状态变量,用不同的整数表示不同状态
private void setState(int state){
this.state = state; //设置传输门当前状态
}
public void getState(){
//此处代码省略,本方法输出状态字符串,
//例如:当前状态为CLOSED时,输出字符串为“CLOSED”
}
public void click(){
if(____) setState(OPENING);
else if(____) setState(CLOSING);
else if(____) setState(STAYOPEN);
}
public void timeout(){
if(state == OPEN) setState(CLOSING);
}
public void complete(){ //发生complete事件时进行状态转换
if(state == OPENING) setState(OPEN);
else if(state == CLOSING) setState(CLOSED);
}
public static void main(String[] args){
Door aDoor = new Door();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();
aDoor.getState();
return;
}
}
Java 代码2如下:
public class Door{
public static final int CLOSED = new DoorClosed(this);
public static final int OPENING = new DoorOpening(this);
public static final int OPEN = new DoorOpen(this);
public static final int CLOSING = new DoorClosing(this);
public static final int STAYOPEN = new DoorStayOpen(this);
private DoorState state = CLOSED;
//设置传输门当前状态
public void setState(DoorState state){
this.state = state;
}
public void getState(){ //根据当前状态输出对应的状态字符串
System.out.println(state.getClass().getName());
}
public void click(){____;} //发生click事件时进行状态转换
public void timeout(){____;} //发生timeout事件时进行状态转换
public void complete(){____;} //发生complete事件时乾地状态转换
public static void main(String[] args) {
Door.aDoor = new Door();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();
aDoor.getState();
return;
}
public abstract class DoorState { //定义所有状态类的基类
protected Door door;
public DoorState(Door door){
this.door = door;
}
public abstract void click(){}
public abstract void complete(){}
public abstract void timeout(){}
}
class DoorClosed extends DoorState{ //定义一个基本的Closed状态
public DoorClosed(Door door){super(door);}
public void click(){____;}
//该类定义的其余代码省略
}
//其余代码省略
正确答案:
(1) state==CLOSED||state==CLOSING 或 state==1||state==4
(2) state==OPENING||STATE==stayopen 或 state==2||state==5
(3) state==OPEN 或 state==3
(4) state.click()
(5) state.timeout()
(6) state.complete()
(7) door.setState(door.OPENING)
3. (填空题)某软件公司欲基于迭代器模式开发一套用于遍历数组元素的类库,其基本结构如图所示:
在图中,Collection类是抽象聚合类,ConcreteCollection类是具体聚合类,Iterator类是抽象迭代器类,ConcreteIterator类是具体迭代器类。在聚合类中提供了创建迭代器的工厂方法createIterator()和数组的Setter()和Getter()方法,在迭代器中提供了用于遍历数组元素的相关方法,如first()、last()、next()等。
请完成以下Java代码中(1)--(10)空的代码填写。
【Java代码】
interface Collection{
public void setArray(Object objs[]); //设置数组
public Object[] getArray(); //获了数组
public Iterator createIteratior(); //创建迭代器
}
interface Iterator{
public void first();
public void last();
public void next();
public void previous();
public boolean isLast();
public boolean isFirst();
public Object getItem();
}
class ConcteteCollection implements Collection{
private Object[] objs;
public void setArray(Object[] objs) {
this.objs = objs;
}
public Object[] getArray(){
return this.objs;
}
public Iterator createIteratior() {
return ____;
}
}
class ConcreteIterator implements Iterator{
private Object[] objs;
private int index = 0; //索引变量,初值为0
public ConcreteIterator(ConcreteIterator collection){
this.objs = ____;
}
public void first(){
index = 0;
}
public void last(){
____;
}
public void next(){
if(index<objs.length){
____;
}
}
public void previous(){
if(index>=0){
____;
}
}
public boolean isLast(){
____;
}
public boolean isFirst(){
____;
}
public Object getItem(){
return objs[index];
}
}
class Test{
public static void main(String[] args) {
Collection collection;
collection = new ConcreteIterator();
Object[] objs ={"北京","上海","广州","深圳","长沙"};
collection.setArray();
Iterator i = ____;
i.last();
//逆向遍历所有元素
while (____){
System.out.println(i.getItem().toString());
____;
}
}
}
正确答案:
(1) new ConcreteIterator(this)
(2) collection.getArray()
(3) index=objs.length-1
(4) index++
(5) index--
(6) return index==objs.length
(7) return index==-1
(8) collection.createIterator()
(9) !I.isFirst()
(10) i.previous()
4. (填空题)已知某企业欲开发一家用电器摇控系统,即用户使用一个遥控器即可控制某睦家用电器的开与关。遥控器如图所示。该遥控器共有4个按钮,编号为0-3,按钮0和按钮2能够遥控打开电器1和电器2,按钮1和按钮3则能遥控关闭电器1和电器2.由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如图所示:
在图中,类RemoteController的方法onPressButton(int button)表示当遥控器按钮按下时调用的方法,参数为按键的编号;Command接口中on()和off()方法分别用于控制电器的开与关;Light中turnLight(int degree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(int channel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。
请完成以下Java代码中空的代码填写。
【Java代码】
class Light{ //电灯类
public void turnLight(int degree){
//调整灯光这度,0表示关灯,100表示变度最大
}
}
class TV{ //电视类
public void setChannel(int channel){
//0表示关机,1表示开机并切换到1频道
}
}
interface Command{ //抽象命令类
void on();
void off ();
}
class RemoteController{ //遥控器类
//摇控器有4个按钮,按照编号分别对应4个Command对象
protected Command[] commands = new Command[4];
//按钮被按下时执行命令对象中的命令
public void onPressButton(int button){
if(button%2==0)commands[button].on();
else commands[button].off();
}
public void setCommands(int button,Command command){
____ = command; //设置每个按钮对应的命令对象
}
}
class LightCommand implements Command{ //电灯命令类
protected Light light; //指向要控制的电灯对象
public void on(){light.turnLight(100);}
public void off(){light.____;}
public LightCommand(Light light){this.light = light;}
}
class TVCommand implements Command{ //电视机命令类
protected TV tv;
public void on() {tv.____;}
public void off(){tv.setChannel(0);}
public TVCommand(TV tv){this.tv = tv;}
}
public class Test{
public static void main(String[] args) {
//创建电灯和电视对象
Light light = new Light();
TV tv = new TV();
LightCommand lightCommand = new LightCommand(light);
TVCommand tvCommand = new TVCommand(tv);
RemoteController remoteController = new RemoteController();
//设置按钮和命令对象
remoteController.setCommands(0,____);
...//此处省略设置按钮1、按钮2、和按钮3的命令对象代码
}
}
本题中,应用命令模式能够有效地让类____和类____、类____之间的耦合性降至最小。
正确答案:
(1) commands[button]
(2) turnLight(0)
(3) setChannel(1)
(4) lightCommand或tvCommand
(5) RemoteController
(6) Light
(7) TV (注:⑥和⑦可以互换)
5. (填空题)已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层级的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。
采用职责链设计模式对上述过程进行设计后得到的类图如图所示:
请完成以下Java代码中(1)--(7)空的代码填写。
【Java代码】
class PurchaseRequest{
public double amount; //一个采购的金额
public int number; //采购单编号
public String purpose; //采购目的
}
class Approver{ //审批者类
public Approver(){successor = null;}
public void processRequest(PurchaseRequest aRequest){
if(successor != null){successor.____;}
}
public void setSuccessor(Approver aSuccessor){successor = aSuccessor;}
private ____ successor;
}
class Congress extends Approver{
public void processRequest(PurchaseRequest aRequest){
if(aRequest.amount>=500000){/*决定是否审批的代码省略*/}
else ____.processRequest(aRequest);
}
}
class Director extends Approver{
public void processRequest(PurchaseRequest aRequest){/*此处代码省略*/}
}
class President extends Approver{
public void processRequest(PurchaseRequest aRequest){/*此处代码省略*/}
}
class VicePresident extends Approver{
public void processRequest(PurchaseRequest aRequest){/*此处代码省略*/}
}
public class Test{
public static void main(String[] args)throws IOException {
Congress meeting = new Congress();
VicePresident sam = new VicePresident();
Director larry = new Director();
President tammy = new President();
//构造职责链
meeting.setSuccessor(null);
sam.setSuccessor(____);
tammy.setSuccessor(____);
larry.setSuccessor(____);
//构造一采购审批请求
PurchaseRequest aRequest = new PurchaseRequest();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
aRequest.amount = Double.parseDouble(br.readLine());
____.processRequest(aRequest);
}
}
正确答案:
(1) processRequest(aRequest)
(2) Approver
(3) super
(4) tammy
(5) meeting
(6) sam
(7) larry
6. (填空题)某软件公司现欲开发一款飞机模拟系统,该系统放要撒气不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表所示:
为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图所示:
在图中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和方法takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与类TakeOffBehavior为抽象类,分别用于表示抽象的飞行行为与起飞行为;类SubSonicFly与类SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与类LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。
请完成以下Java代码中空的代码填写。
【Java代码】
interface FlyBehavior{
public void fly();
}
class SubSonicFly implements FlyBehavior{
public void fly(){
System.out.println("亚音速飞行!");
}
}
class SuperSonicFly implements FlyBehavior{
public void fly(){
System.out.println("超音速飞行!");
}
}
interface TakeOffBehavior{
public void takeOff();
}
class VerticalTakeOff implements TakeOffBehavior{
public void takeOff(){
System.out.println("垂直起飞!");
}
}
class LongDistanceTakeOff implements TakeOffBehavior{
public void takeOff(){
System.out.println("长距离起飞!");
}
}
abstract class AirCraft{
protected ____;
protected ____;
public void fly(){____;}
public void takeOff(){____;}
}
class Helicopter ____ AirCraft{
public Helicopter(){
flyBehavior = new ____;
takeOffBehavior = new ____;
}
}
//其他代码省略
正确答案:
(1) FlyBehavior flyBehavior
(2) TakeOffBehavior takeOffBehavior
(3) flyBehavior.fly()
(4) takeOffBehavior.takeOff()
(5) extends
(6) SubSonicFly()
(7) VerticalTakeOff()
7. (填空题)已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如图所示,其中Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。
当开发一个具体的应用程序时,开发者需要分虽创建自己的Application和Document子类,如上图不的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。
已知Application类中的openDocument()方法采用了模板方法设计模式,该方法定义了打开文档的每一个步骤,如下所示:
(1)首先检查文档是否能够被打开,若不能打开,由给出出错信息并返回。
(2)创建文档对象。
(3)通过文档对象打开文档。
(4)通过文档对象读取文档信息。
(5)将文档对象加入到Application的文档对象集合中。
请完成以下Java代码中(1)--(8)空的代码填写。
【Java代码】
abstract class Document{
public void save(){ /*存储文档数据,此处代码省略*/ }
public void open(String docName){ /*打开文档,此处代码省略*/ }
public void close(){ /*关闭文档,此处代码省略*/ }
public abstract void reak(String docName);
}
abstract class Application{
private Vector<____> docs; /*文档对象集合*/
public boolean canOpenDocument(String docName){
/*判断是否可以打开指定文档,返回真值时表示可以打开,
返回假值表示不可打开,此处代码省略*/
}
public void addDocument(Document aDocument){
/*将文档对象添加到文档对象集合中*/
docs.add(____);
}
public abstract Document doCreateDocument(); /*创建一个文档对象*/
public void openDocument(String docName){ /*打开文档*/
if(____){
System.out.println("文档无法打开!");
return;
}
____ adoc = ____;
____;
____;
____;
}
}
正确答案:
(1) Document
(2) aDocument
(3) !canOpenDocument(docName)
(4) Document
(5) doCreateDocument()
(6) adoc.open(docName)
(7) adoc.read(docName)
(8) addDocument(adoc)