-------android培训、java培训、期待与您交流! ----------
一:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
(一):异步随机生成按照各个路线行驶的车辆:
例如:S2N","S2W","E2W","E2S
1:由南向而来往北向的车辆------>直行车辆
2: 由南向而来往西向的车辆------>左转车辆
3: 由东向而来往西向的车辆------>直行车辆
4: 由东向而来往南向的车辆------>右行车辆
N2S","N2E","W2E","W2N","
1:由北向而来往南向的车辆------>直行车辆
2: 由北向而来往东向的车辆------>左转车辆
3: 由西向而来往东向的车辆------>直行车辆
4: 由西向而来往北向的车辆------>左行车辆
","S2E","E2N","N2W","W2S
1:由南向而来往东向的车辆------>右转弯车辆
2: 由南向而来往西向的车辆------>右转弯车辆
3: 由东向而来往西向的车辆------>右转弯车辆
4: 由东向而来往南向的车辆------>右转弯车辆
(二)信号灯忽略黄灯,只考虑红灯和绿灯;
(三)应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
(四)每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。二:以面向对象的设计方式可以从需求中得到如下类:
(一)汽车路线类(Road):
1:每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
2:每一条路线都有汽车所以要用一个集合( LIst )保存路线中的汽车;
3:每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
因此要在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。
注: 每一条路线都要由交通灯的显示的状况来控制是否可以通行,因此就要检查控制本路线的灯是否为绿灯;如果不是就应该由下一个方向的灯变绿;
public class Road { List<String> vehicles=new ArrayList<String>(); private String name; public Road(){} public Road(String name){ this.name=name; //创建线程一个线程 ExecutorService pool=Executors.newSingleThreadExecutor(); //执行线程的方法并每隔一定的时间就向集合添加一条数据来模拟公路上的车 pool.execute(new Runnable(){ @Override public void run() { for (int i = 0; i <1000; i++) { try { Thread.sleep(new Random().nextInt((10)+1/1000)); vehicles.add(Road.this.name+"---"+i); } catch (InterruptedException e) { e.printStackTrace(); } } } }); //执行线程的方法并每隔一定的时间就把集合的一条数据删除来模拟公路上通过的车 ScheduledExecutorService trime=Executors.newScheduledThreadPool(1); trime.scheduleAtFixedRate( new Runnable(){ @Override public void run() { if(vehicles.size()>0){ boolean lingted=Lamp.valueOf(Road.this.name).isLoghted(); if(lingted){ System.out.println(vehicles.remove(0)+"zou la"); } } } }, 2, 2, TimeUnit.SECONDS); } }
(二)交通灯类(Lamp)使用枚举:
1:因为要产生十二个灯对象实例供程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,,所以使用枚举的形式定义更为简单。
2:该类中还有有两个方法( light () 、blackOut() )来设置灯的状态;
3:这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
public enum Lamp { //使用枚举来创建十二个方向上的灯(参数1:相反的灯,参数2是下一个灯,参数是是否为路灯) 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,false),E2N(null,null,false),N2W(null,null,false),W2S(null,null,false); /*S2N,S2W,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S;*/ private boolean loghted; private String next; private String opposite; private Lamp( String opposite, String next,boolean loghted) { this.loghted = loghted; this.next = next; this.opposite = opposite; } public boolean isLoghted() { return loghted; } //某个灯变绿色时对面的灯也变绿 public void light(){ this.loghted=true; if(opposite!=null){ Lamp.valueOf(opposite).light(); } System.out.println(name()+"lamp is green......下面共有6个方向的汽车穿过"); } //某个灯变红色时对面的灯也变红而下一个灯就变绿 public Lamp blackOut(){ this.loghted=false; if (opposite!=null) { Lamp.valueOf(opposite).blackOut(); } Lamp newlamp=null; if (next!=null) { newlamp=Lamp.valueOf(next); newlamp.light(); System.out.println("绿灯从"+name()+"------->切换为"+next); } return newlamp; } }
(三)系统控制类( Lampcontroller ):
1: 整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例;
2:在创一个方法,在方法中要设定第一个为绿的灯;且在方法中定义一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
public class Lampcontroller { private Lamp currentLamp; //使用单利设计模式 private Lampcontroller(){}; private static Lampcontroller lampc=new Lampcontroller(); public static Lampcontroller getLampcontroller(){ return lampc; } public void show(){ currentLamp=Lamp.S2N; currentLamp.light(); //每隔10秒就把当前的灯变红并让下一个方向的灯变绿 ScheduledExecutorService timer=Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable(){ @Override public void run() { currentLamp=currentLamp.blackOut(); } }, 10, 10, TimeUnit.SECONDS); } }
(四):程序入口类(ClassMain):
1:使用循环实例化枚举类获取十二条路线的对象并并传入到Road类的构造函数;
2:获取到系统控制类的实例对象调用start方法;
public static void main(String[] args) { // TODO Auto-generated method stub //产生12个方向的路线 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]); } //调用交通灯系统 Lampcontroller.getLampcontroller().show(); }
总结:
1:先要需求中以面向对象的方式分析出要涉及类的,每个类中所涉及的动作、属性;
2:在通过每个类所要涉及的动作来确定要是使用什么方式实现;
3:在实现了功能的情况下在想办法去优化系统的功能从而提高代码的健壮性;
4:怎么在一个类中来通过API找到能实现功能的方法;
5:在遇到异常时能先看发生的是什么异常在重异常中找到可能发生异常的位置在解决异常;
-------android培训、java培训、期待与您交流! ----------