如何用JAVA实现这个盒子?
假设需要制造一个带有四个按钮和两个灯泡的盒子并且有以下功能:
(1)有四个按钮输入,分别称为B1,B2,B3,B4;
(2)有两个灯泡作为输出,分别称为L1和L2;
(3)B1是打开电源的按钮;
(4)B4是关闭电源的按钮;
(5)B2和B3是操作按钮;
(6)在B1被按下后及B4被按下前,系统应称为电源打开状态;
(7)在B4被按下后及B1被按下前,系统应称为电源关闭状态;
(8)在电源关闭状态下,B2和B3按钮不起作用;
(9)在电源关闭状态下,灯应不亮;
(10)从最近一次电源打开状态算起,如果B2被按下的次数比B3被按下的次数多,L1亮,否则L2亮;
(11)任何时候都不能有一个以上的灯泡亮;
(12)如果其中的一个灯泡出现故障,另一个灯泡应以2秒钟的间隔闪烁,而不管B2和B3的操作过程。当B4按下时,闪烁停止;当B1被按下是,闪烁重新开始。当故障别排除后闪烁停止,
系恢复正常状态;
小弟初学JAVA,请问用JAVA如何实现这个程序?希望大家可以帮帮我,谢谢大家了!
[解决办法]
- Java code
//保存为TestBox.java//测试类public class TestBox{ public static void main(String[] args){ Box box = new Box(); box.b1(); //打开电源 box.b2();//按b2 (对应L1) box.b3(); //按b3 (对应L2) box.b3(); //按b3 (对应L2) box.showL1L2Status(); box.brokenLight1(); //砸烂L1 box.showL1L2Status();//显示2个灯的状态 box.b4(); //关灯 box.showL1L2Status(); //显示2个灯的状态 box.b1(); //再开灯 box.showL1L2Status(); //显示2个灯的状态 box.repairLight(); //关灯,修理灯 box.showL1L2Status(); //显示2个灯的状态 box.b1(); //修理后重新打开电源 box.b2(); box.showL1L2Status(); }}//盒子类class Box { private boolean power = false;//电源 private Light l1 = new Light();//电灯一 private Light l2 = new Light();//电灯二 public void b1(){ //开打电源 power = true; l1.setCount(0); //每次重开电源,重新计算L1,L2被按的次数 l2.setCount(0); } public void b2(){ //按b2按钮,对应L1 if( !power){ //如果电源没开,不响应, return; } else{ this.l1.AddCount(); //System.out.println("l2:" + l1.getCount()); if( !checkBroken()){ //只有灯没坏时才响应 int light1Count = l1.getCount(); int light2Count = l2.getCount(); if( light1Count > light2Count){ l1.setStatus("light"); l2.setStatus("unlight"); } else {if ( light2Count > light1Count){ l2.setStatus("light"); l2.setStatus("unlight"); } else { l1.setStatus("unlight"); l2.setStatus("unlight"); }} }//if(!checkBroken) else{ //灯坏了,就不响应 if( l1.getStatus().equals("broken")){ l2.setStatus("glimpse"); } else{ l1.setStatus("glimpse"); } }// checkBroken else } } public void b3(){ //参照b2的注释 if( !power){ return; } else{ this.l2.AddCount(); //System.out.println("l2:" + l2.getCount()); if( !checkBroken()){ int light1Count = l1.getCount(); int light2Count = l2.getCount(); if( light1Count > light2Count){ l1.setStatus("light"); l2.setStatus("unlight"); } else{ if ( light2Count > light1Count){ l2.setStatus("light"); l1.setStatus("unlight"); } else { l1.setStatus("unlight"); l2.setStatus("unlight"); } } }//if(!checkBroken) else{ if( l1.getStatus().equals("broken")){ l2.setStatus("glimpse"); } else{ l1.setStatus("glimpse"); } }// checkBroken else } } public void b4(){ //关电源 power = false; //没坏的话,就设置灯为关闭状态,否则保持原来的状态 if ( (!this.l1.getStatus().equals("broken")) &&(!this.l2.getStatus().equals("broken"))){ l1.setStatus("unlight"); l2.setStatus("unlight"); } } //关灯,并将坏的灯泡休息好 public void repairLight(){ System.out.println("操作:关电灯,修理"); b4(); l1.setStatus("unlight"); l2.setStatus("unlight"); } //将L1砸烂 public void brokenLight1(){ l1.setStatus("broken"); l2.setStatus("glimpse"); } //将L2砸烂 public void brokenLight2(){ l2.setStatus("broken"); l1.setStatus("glimpse"); } //显示目前灯的状态 public void showL1L2Status(){ if(power){ System.out.println("L1的状态:" + l1.getStatus()); System.out.println("L2的状态:" + l2.getStatus()); } else{ System.out.println("L1的状态:unlight"); System.out.println("L2的状态:unlight"); } } //检查是否有灯坏了,有的话返回true,否则返回false public boolean checkBroken(){ boolean flag = false; if( l1.getStatus().equals("broken") || l2.getStatus().equals("broken")){ flag = true; } return flag; } }//灯泡类class Light{ private String status = "unlight";//状态,从unlight light glimpse broken中选一个 private int count = 0; //被按下按钮的次数+1 public void AddCount(){ this.count++; } //取得被按下的次数 public int getCount(){ return this.count; } //设置被按下的次数 public void setCount(int count){ this.count = count; } //取得灯泡的状态 public String getStatus(){ return this.status; } //设置灯泡的状态 public void setStatus(String status){ this.status = status; }}
[解决办法]
图形化,要弄死人的。
[解决办法]
我觉得这道题关键是考设计思想,这里面包含设计模式的精髓,相反结果倒不是很要
其实这道题最好的设计模式就是借鉴java的awt或swing,button相当于awt的button,box相当于容器,就当作frame好了,lamp相当button以外的component,就当作image或panel都行。这样的话可以模仿awt写一套class
以下给出模型,具体就不写了
interface ButtonListener {
onClick(ButtonEvent e);
}
class ButtonEvent {
Object src;
int eventId;
Map optionalInfo;
public ButtonEvent(Object src, int eventId) {
//
}
}
class Component {
//这里追加共有的属性和方法,比如setSize, setLocation, setBounds之类的,这样可以设置控件的大小位置,比如要控件放在box的那个位置,尺寸多少
}
class Button extends Component{
List listeners;
int clickCount;
public void addButtonListener(ButtonListener l) {
}
public void removeButtonListener(ButtonListener l) {
}
protected doClick() {
//这里面要发生ButtonEvent事件,然后回调listener
}
}
class Lamp extends Component {
int state; //状态
Color color; //灯光颜色
//还可以设置些比如功率,额定电压等等属性,然后追加相应的方法
FlashThread flashThread; //闪烁用线程
public powerOn() {
}
public powerOff() {
}
public flash(long time) {
}
public stopFlash() {
}
class FlashThread extends Thread {
public void run() {
}
}
}
class Container {
//这里设置容器的共同属性和方法,比如add(Component c)等等,用以添加控件到容器上
}
class Box extends Container implements ButtonListener {
Button[4] buttons;
Lamp[2] lamp;
public Box () {
}
public void onClick(ButtonEvent e) {
Object obj = e.getSource();
if (obj == buttons[0]) {
} else if ...
}
}
以上这样的设计模式,是按sun的awt或swing的思想去实现的,应该最符合面向对象的设计
LZ可能现在理解有限,不过将来等你技术有所提高后再回过头来看,这道题还是蛮值得研究的。
就用swing写一套基于图形化的,其实不难,有空再给你写一个。