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

--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------

1.   交通灯管理系统的项目需求:

(1)    异步随机生成按照各个路线行驶的车辆。

(2)    信号灯忽略黄灯,只考虑红灯和绿灯。

(3)    应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

(4)    具体信号灯控制逻辑与现实相同:南北方向车辆与东西方向车辆交替

放行,同方向车辆应该先放行直行车辆而后放行左转车辆。

(5)    每辆车通过路口时间为1秒(可通过Sleep的方式模拟)

(6)    随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

(7)    不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


2.交通灯控制逻辑分析:

(1)4个路口,每个路口有直走,左转,右转3个方向。其中现实中右转不受灯控制为了统一各个方向的特征,

假设右转有1个常绿的灯。

(2)每种车辆运动方式对应一个灯,就有12个灯,考虑到对称性,只需考虑4个灯,再除去常绿的灯,只需写3个灯的控制代码。


3.车辆运动逻辑分析:

(1)车辆运动受自己运动方向的交通灯控制

(2)车辆通过路口要考虑自己前方路口是否有车


4.面向对象设计原则:

(1) 谁拥有数据,谁就应该对外提供操作数据的方法,

(2)一个对象变成另一个对象,改方法不能放在对象本身,如stone->knife :Knife k=KnifeFactory.careakKnife(Stone s1,Stones2)


5.面向对象分析:

(1)当车辆要了解自己前方是否有车,应该从某处获得该信息。因为车辆都在路上,路在程序中可视为一个集合,车辆就是其中的 元素。所以路应该有增加,减少和查询的方法。

(2)路随机生成车辆,并根据等的状态决定其是否通过。

(2)每隔一定时间改变灯的状态,要有一个交通灯控制器。

(2)在这个项目中,不需要体现车辆移动的过程,只需捕捉车辆穿过路口的过程,只要过了路口,这车就不需要考虑了。所以车不 需要单独设计成一个对象,用一个字符串表示就可以了。

(3)不管多少辆车,灯都是固定的12个,每个灯在2个状态间切换,所以可以用枚举来表示交通灯,每个元素表示灯控制的一个方 向。


7.程序实现:

(1)Lamp枚举,记录交通灯状态,定义交通灯枚举元素间的变化关系

enum Lamp{
    S2N("N2S",false,"S2W"),S2W("N2E",false,"W2E"),S2E("N2W",true,"S2E"),
    W2E("E2W",false,"W2N"),W2N("E2S",false,"S2N"),W2S("E2N",true,"W2S"),
    N2S(null,false,null),N2E(null,false,null),N2W(null,false,null),   
    E2W(null,false,null),E2S(null,false,null),E2N(null,false,null);
    private String opposite;
    private boolean lighted;
    private String next;
    private Lamp(String opposite,Boolean lighted,String next){
	this.opposite=opposite;
	this.lighted=lighted;
	this.next=next;
    }

    public void light(){
	this.lighted=true;
	if(opposite!=null){
	    Lamp LampOpposite=Lamp.valueOf(opposite);
	    LampOpposite.light();
	   
	}
	 System.out.println(name()+"lamp is green,下面总共应该6个方向能看到车辆穿过!");
	
    }
    public Lamp blackOut(){
	this.lighted=false;
	if(opposite!=null){
	    Lamp lampOpposite=Lamp.valueOf(opposite);
	    lampOpposite.blackOut();
	}
	Lamp nextLamp=null;
	if(next!=null){
	    nextLamp=Lamp.valueOf(next);
	    System.out.println("绿灯从"+name()+"------->切换为"+nextLamp.name());
	    nextLamp.light();
	  
	}
	return nextLamp;
    }
   public boolean isLighted(){
    return this.lighted;
   }
}


(2)LampController 交通灯控制器类:控制交通灯随时间变化


package com.isoftsone.interview;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class LampController {
    private static LampController instance=new LampController();
    public static LampController getInstance(){
	return instance;
    }
    private Lamp currentLamp=null;
    public LampController(){
	currentLamp=Lamp.S2N;
    }
    public void start(){
	currentLamp.light();
	Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
		new Runnable() {
		    
		    @Override
		    public void run() {
			// TODO 自动生成的方法存根
			currentLamp=currentLamp.blackOut();
		    }
		},10,10,TimeUnit.SECONDS);
    }
    
}
(3)Road类:生成随机车辆,并根据交通灯控制车辆的通过
package com.isoftsone.interview;
import java.util.*;
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() {	    
	    @Override
	    public void run() {
		// TODO 自动生成的方法存根
		for(int i=1;i<1000;i++){
		    try {
			Thread.sleep((new Random().nextInt(10)+1)*1000);
		    } catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		    }
		    vechicles.add(Road.this.name+"_"+i);
		}
	    }
	});
	ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
	timer.scheduleAtFixedRate(
		new Runnable() {	    
		    @Override
		    public void run() {
			// TODO 自动生成的方法存根
			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);
			
    }
    
(4)TransportLamp交通灯项目主类,调用各个项目各个部分实现功能
package com.isoftsone.interview;

import javax.swing.text.StyledEditorKit.ForegroundAction;

public class TransportLamp {
    public static String[] RoadLine={"S2N","S2W","S2E","N2S","N2W","N2E","W2E","W2N","W2S","E2W","E2N","E2S"};
	    public static void main(String[] args) {
	// TODO 自动生成的方法存根
		new LampController().start();
        	for(int i=0;i<12;i++){
        	    new Road(RoadLine[i]);	
        	}
        	
	    }

}

--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值