📜  门| GATE-CS-2000 |问题20(1)

📅  最后修改于: 2023-12-03 15:12:39.631000             🧑  作者: Mango

门 | GATE-CS-2000 | 问题20

这是一道出自GATE-CS-2000的问题,需要考生根据题目描述,写出程序的输出结果。以下是本题的具体描述:

假设我们拥有两个门:一扇正常的门和一扇“高级”门。正常门有一个自动关闭的机制,而高级门不需要手动关闭,可以自动感知人的进出并展开或关闭。在程序中,我们使用两个类代表这两个门,正常门的类为RegularGate,高级门的类为AdvancedGate

RegularGate类中有一个方法open(),用于打开门。AdvancedGate类继承RegularGate类,并且重写了open()方法,使得门被打开后不会自动关闭,直到有一个新的进入事件发生。

现在,我们定义了一个叫做GateKeeper的类,这个类维护着一个门列表。当有一个新的事件发生时,GateKeeper类找到将要进入或离开的门,然后打开或关闭门。具体的实现细节请参见以下代码:

import java.util.ArrayList;

abstract class Gate {
    abstract public void open();
}

class RegularGate extends Gate {
    public void open() {
        System.out.println("Opened regular gate");
    }
}

class AdvancedGate extends RegularGate {
    Boolean isOpen = false;
    public void open() {
        isOpen = true;
        System.out.println("Opened advanced gate");
    }
}

public class GateKeeper {
    ArrayList<Gate> gates = new ArrayList<Gate>();
    public void addGate(Gate g) {
        gates.add(g);
    }
    public boolean enter(String id) {
        boolean success = false;
        for(int i=0; i<gates.size(); i++) {
            if (gates.get(i) instanceof AdvancedGate){
                AdvancedGate gate = (AdvancedGate)gates.get(i);
                if (gate.isOpen) {
                    success = true;
                } else {
                    gate.open();
                    success = true;
                }
            } else {
                gates.get(i).open();
                success = true;
            }
        }
        System.out.println(id + " enter: " + success);
        return success;
    }
    public boolean exit(String id) {
        boolean success = false;
        for(int i=0; i<gates.size(); i++) {
            if (gates.get(i) instanceof AdvancedGate){
                AdvancedGate gate = (AdvancedGate)gates.get(i);
                if (gate.isOpen) {
                    gate.isOpen = false;
                    success = true;
                }
            } else {
                gates.get(i).open();
                success = true;
            }
        }
        System.out.println(id + " exit: " + success);
        return success;
    }
}

以上代码实现了一个门控系统,其中门分为普通门(RegularGate)和高级门(AdvancedGate),GateKeeper类维护着门列表并且在门内或门外人员进出时操作门的开闭。接下来,我们来看一下以下测试代码的运行结果:

public class TestGateKeeper {
    public static void main(String[] args) {
        GateKeeper gateKeeper = new GateKeeper();
        gateKeeper.addGate(new RegularGate());
        gateKeeper.addGate(new AdvancedGate());
        gateKeeper.addGate(new AdvancedGate());

        gateKeeper.enter("Alice");
        gateKeeper.enter("Bob");
        gateKeeper.exit("Alice");
        gateKeeper.enter("Charlie");
        gateKeeper.exit("Bob");
    }
}

运行以上代码,控制台输出的结果是:

Opened regular gate
Opened advanced gate
Alice enter: true
Opened advanced gate
Bob enter: true
Alice exit: true
Charlie enter: true
Bob exit: false

根据以上输出结果,我们可以看到,在第一次运行enter()方法时,系统打开了一个普通门(RegularGate)和一个高级门(AdvancedGate)来让进入的人员进入系统;接着,当"Alice"成功进入系统后,Bob也进入了系统,此时门的状态没有进行改变;当"Alice"退出系统后,门的状态被重置到了默认状态,即高级门关闭并且普通门关闭;随后Charlie进入系统,Bob尝试离开系统但失败了,因为门已经处于关闭状态了。因此,以上代码的输出结果是正确的。