交通灯管理系统


在 面向对象程序设计中,谁拥有数据谁就对外提供操作这些数据的方法。经典例子:人在黑板上画圆(对象有人,黑板,圆,圆有数据半径,面积,周长,所以应该是 圆提供这些方法),售票员通过小票清点货款和商品(对象有售票员,小票,售票员通过调用小票的gettotalmoney()方法得到货款等)。

两块石头磨成石刀,石头刀砍树,砍成木材,木材做成椅子。

石头磨成刀,如果它自身提供这个功能的话,那就最后没了,显然不会,所以这里有一个磨刀工厂,原料是石头,产品是石头刀

stoneKnife knifeFactory(Stonge s).

石头刀有砍树方法,原料是树,产品是木材 wood cut(Tree t)

椅子加工厂,原料是wood,产品是chair 。  Chair chairMaker(Wood w).

在 交通灯管理系统中,有对象车,路,灯,还有灯控制系统,用字符串表示车,放在ArrayList中,封装在Road类中,Road类有当绿灯时把车放行的 方法,还有随机的增加车辆的方法。所有的灯共12只都封装在Lamp类中,Lamp类提供的方法有:变绿,变红。灯的控制系统封装在类 lampControl中,提供的方法是当前灯绿,过一定时间后下一个灯绿,同时当前灯和对面的灯都变红。

下面是代码:
Lamp 类

package com.isoftstone.interview.traffic;


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(){   //将灯变亮的方法封装在类Lamp中
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

}


public Lamp blackOut(){                //将灯变黑的方法封装在类Lamp中

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类:

package com.isoftstone.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class LampController {
private Lamp currentLamp;

public LampController(){
//刚开始让由南向北的灯变绿;
currentLamp = Lamp.S2N;
currentLamp.light();


ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("来啊");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}

Road类:

//Road类中封装了路上车的增加和减少。
package com.isoftstone.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


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);

}
}


Main类!

package com.isoftstone.interview.traffic;

public class MainClass {


public static void main(String[] args) {


String [] directions = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}


new LampController();
}

}

小结:我认识到做项目前应该先把思路理清,然后才是具体代码的实现。另外,通过今天的学习我对面向对象程序设计认识更进了一步,但自己思考问题解决问题能力和代码实现能力还很欠缺,路漫漫啊,继续努力吧,加油!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章