读书人

怎么用JAVA实现这个盒子

发布时间: 2011-12-14 23:20:17 作者: rapoo

如何用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写一套基于图形化的,其实不难,有空再给你写一个。

读书人网 >J2SE开发

热点推荐