您的位置:首页 > 职场人生

黑马程序员_交通灯管理系统

2011-11-17 12:01 288 查看
---------------------- android培训java培训、期待与您交流! ----------------------

刚开始看本系统,感觉迷迷糊糊的,原因很多,例如对生活观察不够仔细,一直想不通为啥N2S和S2N可以同时为GREEN,后经同学指点,原来本该如此,我竟然犯了个小儿科的错误。还有一点就是动手能力太差,虽然知道程序怎么个流程,却不知代码从何处入手。仔细看了几遍张老师的讲解,心里大致有了个思路,又反复斟酌,发现程序不过如此,就几行代码而已嘛!呵呵,大话不多说了,还是照个张老师的讲解,把系统给分解下。

1.先是需求分析

2.然后画个简图,帮助理解。

3.接下来就是代码的编写了

张老师对于面向对象的经验总结:谁拥有数据,谁就对外提供操作这些数据的方法。

几个常见的面向对象实例

(1)两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子

StoneKnife = KnifeFactory.creatKnife(stone)

material = StoneKnife.cut(tree)

chair = ChairFactory.makeChair(material)

(2)“球从一根绳子的一段移动到了另一端”,

Road类的编写

每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。
public class Road {

private List<String> vechicles = new ArrayList<String>();

private String name =null;

public Road(String name){

this.name = name;

//模拟车辆不断随机上路的过程

ExecutorService pool = Executors.newSingleThreadExecutor();

pool.execute(new Runnable(){

public void run(){

for(int i=1;i<1000;i++){

try {

Thread.sleep((new Random().nextInt(10) + 1) * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

vechicles.add(Road.this.name + "_" + i);

}

}

});

//每隔一秒检查对应的灯是否为绿,是则放行一辆车

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

if(vechicles.size()>0){

boolean lighted = Lamp.valueOf(Road.this.name).isLighted();

if(lighted){

System.out.println(vechicles.remove(0) + " is traversing !");

}

}

}

},

1,

1,

TimeUnit.SECONDS);

}

}

Lamp类的编写

系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。
增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。

public enum Lamp {

/*每个枚举元素各表示一个方向的控制灯*/

S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),

/*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/

N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),

/*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/

S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);

private Lamp(String opposite,String next,boolean lighted){

this.opposite = opposite;

this.next = next;

this.lighted = lighted;

}

/*当前灯是否为绿*/

private boolean lighted;

/*与当前灯同时为绿的对应方向*/

private String opposite;

/*当前灯变红时下一个变绿的灯*/

private String next;

public boolean isLighted(){

return lighted;

}

/**

* 某个灯变绿时,它对应方向的灯也要变绿

*/

public void light(){

this.lighted = true;

if(opposite != null){

Lamp.valueOf(opposite).light();

}

System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

}

/**

* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿

* @return 下一个要变绿的灯

*/

public Lamp blackOut(){

this.lighted = false;

if(opposite != null){

Lamp.valueOf(opposite).blackOut();

}

Lamp nextLamp= null;

if(next != null){

nextLamp = Lamp.valueOf(next);

System.out.println("绿灯从" + name() + "-------->切换为" + next);

nextLamp.light();

}

return nextLamp;

}

}

LampController类的编写

整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。lLampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
public class LampController {

private Lamp currentLamp;

public LampController(){

//刚开始让由南向北的灯变绿;

currentLamp = Lamp.S2N;

currentLamp.light();

/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

System.out.println("来啊");

currentLamp = currentLamp.blackOut();

}

},

10,

10,

TimeUnit.SECONDS);

}

}
最后写个Main函数算是项目完成了
总结:刚开始写程序的确感到无从下手,看完视频有点启发,需求分析很重要,搞清楚了用户的需求才可以构架出整个系统的模型,然后画简图来帮助自己分析。最后就是写代码了,代码写的要规范,对于自己写的代码也要进行优化,不然执行效率会很低,也显得自己没有水平。

---------------------- android培训java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: