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

------- android培训java培训、期待与您交流! ----------

面向对象的关键:谁拥有数据,谁就对外提供这个数据的操作方法。

面向对象练习:两块石头磨成一把刀,石刀可以砍树,砍成木材,木材可以坐成椅子。

有一个石刀加工厂,一把石刀需要两块石头,石刀有个砍树的方法,返回木材,需要传入树木,又有一个椅子工厂,有一个制造椅子的方法需要传入木材返回椅子。

一共有12条路,E2W,E2S,E2N, 

       S2N,S2W,S2E,

       W2E,W2N,W2S,

       N2S,N2E,N2W

其中右拐弯的被假设为常绿状态,E2N,N2W,W2S,S2E不用考虑,还剩下八条线,这八条线中有4组是两两对应的,也就是说只用考虑4条线,只考虑图中标了数字的4条线,

E2W东向西,E2S东向南(W2EW2N是相同的操作)

S2N南向北,S2W南向西(N2S,N2E是相同操作)

需要:

灯有12个是不变的,用枚举。

lamp类:

  让绿灯亮,对面灯也亮

  让当前绿灯灭,下一个绿灯亮

路线

road类:

  不定时的在路上添加车

  每隔1s取走一辆车,集合中第一个。也就相当于路口排队等红绿灯的,等到绿灯开走一辆,开走的自然是排在最前面的一辆了,而开走需要时间,定为1s一辆。


灯的控制器

lampcontroller类:

  有一个当前灯

  先让南边的走

  每隔10s让当前绿灯灭,下一个灯绿

监控

monitoring类:

  一个集合

  添加通行的路口

  查看全部通行路口

  清空集合

main类

  创建12条路,

  启动系统

 

 

package itcast.interview;

/**
 * 交通灯类,负责熄灭绿灯,开启绿灯
 * @author Administrator
 *
 */
public enum Lamp {
	//只用对E2W东向西,E2S东向南,S2N南向北,S2W南向西进行控制
													//这4个灯为常绿
	//这里不能直接传入方向灯,
	//因为总有传入的没有被创建出来
	//只能传入字符串,然后通过枚举valueOf方法返回枚举
	E2W("W2E","E2S",false),E2S("W2N","S2N",false),E2N(null,null,true),
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),S2E(null,null,true),
	
	W2E(null,null,false),W2N(null,null,false),	W2S(null,null,true),
	N2S(null,null,false),N2E(null,null,false),	N2W(null,null,true);
	
	//当是否为绿灯亮,true为绿灯亮
	private boolean lighted;
	//对面方向的灯
	private String opposite;
	//下一个灯
	private String next;
	
	private Lamp(String opposite, String next, boolean lighted){
		this.lighted = lighted;
		this.opposite = opposite;
		this.next = next;
	}
	public void light(){
		System.out.println("kuangjin");
		//让当前路的绿灯亮
		this.lighted=true;
		//让对面的绿灯也亮,但是只有那4条线路有权力
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
	}
	public Lamp blackOut(){
		//灭掉当前路的绿灯,相当于让红灯亮起,绿灯熄。
		this.lighted = false;
		//灭掉对面的绿灯,也是只有那4条线路有这个权力
		if(opposite != null){
			Lamp.valueOf(opposite).blackOut();
		}
		Lamp nextLamp = null;
		//让下一个路线的绿灯亮
		if(next != null){
			nextLamp = Lamp.valueOf(next);
			System.out.println(this.name() + "路红灯亮起," + nextLamp + "路绿灯亮起");
			nextLamp.light();
		}
		return nextLamp;
	}
	public boolean isLighted(){
		return this.lighted;
	}
}

 

package itcast.interview;

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;
	public Road(String name){
		this.name = name;
		//不定时的添加车辆需要时间,不能让创建对象一直等,所有专门弄一个线程
		ExecutorService thread = Executors.newSingleThreadExecutor();
		thread.execute(new Runnable(){
			@Override
			public void run() {
				//不定时的添加车辆
				for(int i = 0; i < 1000; i++){
					try {
						Thread.sleep((new Random().nextInt(10) + 1) *1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					vechicles.add(Road.this.name + "_" + i);
				}
			}
		});
		
		//每隔1s看一下这条路的绿灯是否是亮的,是就走一辆扯。
		ScheduledExecutorService timerThread = Executors.newScheduledThreadPool(1);
		timerThread.scheduleAtFixedRate(new Runnable(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//判断路上是否有车
				if(vechicles.size() > 0){
					//判断当前路是否是绿灯亮起
					if(Lamp.valueOf(Road.this.name).isLighted()){
						//把当前通行的路口存入监控类
						Monitoring.addLamp(Road.this.name);
						//每次都是删除第一辆车
						System.out.println(vechicles.remove(0) + " 过路口了");
					}
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}

}

package itcast.interview;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 * 交通灯控制类,负责每隔一段时间切换交通灯
 * @author Administrator
 *
 */
public class LampController {
	private Lamp currentLamp;
	public LampController(){
		//先从东向西线路绿灯亮
		currentLamp = Lamp.E2W;
		currentLamp.light();
		
		//每隔10s换一条路线,让当前路线红灯亮起,下一个路线绿灯亮起
		ScheduledExecutorService timerThread = Executors.newScheduledThreadPool(1);
		timerThread.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				//查看这10s内有哪些路口通行过
				Monitoring.findByLamList();
				//清空监控类集合
				Monitoring.clearLampList();
				//切换路线,获取当前绿灯路线
				currentLamp = currentLamp.blackOut();
				System.out.println(currentLamp);
			}
		},10, 10, TimeUnit.SECONDS);
	}
}

package itcast.interview;

import java.util.TreeSet;

/**
 * 监控在一段时间内有哪些路口通行。
 * @author Administrator
 *
 */

public class Monitoring {
	private static TreeSet<String> treeset = new TreeSet<String>();
	//添加通行路口
	public static void addLamp(String lamp){
		treeset.add(lamp);
	}
	//打印全部通行的路口
	public static void findByLamList(){
		StringBuilder sb = new StringBuilder("这段时间通行的路线有:");
		for(String str : treeset){
			sb.append(str + ", ");
		}
		sb.delete(sb.length() - 2, sb.length());
		System.out.println(sb.toString());
	}
	//清空集合
	public static void clearLampList(){
		treeset.clear();
	}
}

package itcast.interview;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] directions = {"E2W","E2S","E2N",
								"S2N","S2W","S2E",
								"W2E","W2N","W2S",
								"N2S","N2E","N2W"};
		//产生12条路线 
		for(int i = 0; i < directions.length; i++){
			new Road(directions[i]);
		}
		
		//启动交通灯系统
		new LampController();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值