行为型设计模式典型设计题

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值