黑马程序员_交通灯系统代码学习

来源:互联网 发布:linux基础知识总结 编辑:程序博客网 时间:2024/04/30 12:01
------- android培训、java培训、期待与您交流! ----------

交通灯系统,需求:

 

有一个十字路口,请用程序模拟该路口的通过过程。

 

首先分析对象:

一个路口应该有一个灯类,还要有一个管理等的类,还需要拥有车的道路道路。

 

分析路线:

初步分析应该有12条道路。对这十二条道路简化分析:首先右转弯的4条道路永远是绿灯。

首先考虑这四条道路S2N S2W E2W E2S 然后发现这四条道路对面的灯和这四条道路的通行情况和其以一样。所有可以通过考虑对面方向来简化4条道路

最后只用考虑4条道路的通行情况,就可以得到最终简化模型。

 

再设计灯模型:

灯应该有一个对面的等属性,还应该有下一个灯属性,还需要一个是否是绿灯属性。

我们发现,这12个灯是不会同其他程序变化而变化的,所以想到枚举类型。(这里也可以不使用枚举类型,使用面向对象的思维,设计12个方向对象,每个对象都应该有opposite、next、lighted这三个属性)

所以设计一个灯的构造方法:

private Lamp(String opposite,String next,boolean lighted){this.opposite=opposite;this.next =next;this.lighted = lighted;};

根据谁持有数据,谁就应该拥有操作数据的方法思想,我们应该给灯对象添加开关灯的方法以及判断该方向的绿灯是否是绿色的方法。
public boolean isLighted(){return lighted;}public void light(){//灯变绿的方法this.lighted = true;//开灯后,将该灯的lighted属性变为true,同时还应该让对面位置的灯的lighted属性变为trueif(opposite!=null){Lamp.valueOf(opposite).light();System.out.println(this.name()+" "+"灯变绿了。你能看到6个方向车上路");System.out.println(Lamp.valueOf(opposite).name()+" "+"灯变绿了。你能看到6个方向车上路");}}public Lamp blackOut(){this.lighted = false;// /关灯后,将该灯的lighted属性变为false,同时还应该让对面位置的灯的lighted属性变为falseif(opposite!=null){Lamp.valueOf(opposite).blackOut();}Lamp nextLamp = null;if(next!=null){//在this灯变为红灯时,还需要找到下一盏灯变为绿色。nextLamp = Lamp.valueOf(next);System.out.println(opposite+"变红了     "+next+"变绿了");nextLamp.light();//调用灯的light()方法,这个方法还能使得对面等变为相同的绿色状态}return nextLamp;//返回下一个灯,好用来继续调用lamp的breakOut方法。}}

分析路对象。我们可以看到,这到题中主要是模拟车辆通行状态,没有要求写出通行过程,所以我们可以定义一个List集合,在里面添加字符串的方式模拟车辆的随机出现和通行状态。

 //定义List集合。

public class Road {List<String> vechicles = new ArrayList<String>();private String name;//设置这条道路有一个名字,这个名字将会在创建方向时传进来public Road(String name){//构造方法初始化之后就会产生两个线程,一个是产生车的,一个是车辆通行的。this.name = name;ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable() {//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。jdk1.5新增加的。这个线程会在空闲的时候不断给道路增加车辆@Overridepublic void run() {for(int i=0;i<1000;i++){try {Thread.sleep((int)((Math.random()+1))*10000);//创建产生车辆的随机时间。} catch (InterruptedException e) {e.printStackTrace();}vechicles.add(Road.this.name+"_"+i);//调用了道路的名字}}});ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);// 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。timer.scheduleAtFixedRate(new Runnable() {//调用timer的scheduleAtFixedRate方法,创建并执行一个在给定初始延迟后首次启用的定期操作,设置时间为1秒,这里是指每过一秒,车辆检查道路能否通行,能通行就通行。@Overridepublic void run() {if(vechicles.size()>0){//判断有没有车辆boolean lighted =Lamp.valueOf(Road.this.name).isLighted();//判断是否能够通行if(lighted){System.out.println(vechicles.remove(0)+" is moving !");}}}},1, 1,TimeUnit.SECONDS);//设置时间格式}}

在整个对象创建完成后我们需要设置一个main方法。让曾哥实例对象run起来。

public class MainClass {public static void main(String[] args){String[] carRoad = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for (int i = 0; i < carRoad.length; i++) {new Road(carRoad[i]);}//创建12条道路new LampController();//让车辆跑起来。。。。。。。。}}


整个小项目里面,主要要学习到如何去分析问题,如何把一个复杂的问题分析成一个简单的问题,然后去找出该问题需要些什么对象,对象需要什么属性和方法。一定要坚持面向对象的思想去分析问题,秉承谁拥有数据谁就拥有操控该数据的方法这个原则。


------- android培训、java培训、期待与您交流! ----------
0 0
原创粉丝点击