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

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

 

面向对象设计思想

面向对象设计思想:

有问题后,分析问题中:1、有哪些类 2、类里有哪些属性和哪些方法 3、以及类与类之间的关系。

 

一句总结面向对象分析思路的经典语句:

谁拥有数据,谁就对外提供访问数据的方法。
1、球从一根绳子的一端移动到了另一端;
		分析:名词提炼法,球和绳子为类;
 			球有属性:绳子,即在哪根绳子上移动; 点,现在所在的位置。
 			球有方法:移动;
 
 			绳子有属性:绳子两端点;
 			绳子有方法:下一点位置。
  
*/

class Rope {
	private Point start;
	private Point end;
	Rope(Point start, Point end) {
		this.start = start;
		this.end = end;
	}
	
	public Point nextPoint(Point currentPoint) {
		if(currentPoint.equals(end)) {
			return null;
		}
		if(!(currentPoint.isPointOfRope()) {
			throw new Exception("此点不在直线上");
		}
		//计算下一个点的位置nextPoint
		return nextPoint;
	}
}

class Ball {
	private Rope rope;
	private Point currentPoint;
	
	Ball(Rope rope, Point currentPoint) {
		this.rope = rope;
		this.currentPoint = currentPoint;
	}
	
	public void move() {
		currentPoint = rope.nextPoint(currentPoint);
		System.out.println("移动到了..." + currentPoint);
	}
}


 

/*
用面向对象的方式设计如下情景
 
2、两块石头磨成一把石刀,石刀将树砍成木材,木材做成椅子。
 
*/

/*
Stone
StoneKnife = StoneFactory.produceKnife(Stone);
Tree
Wood = StoneKnife.cut(Tree);
Chair = WoodFactory.makeChair(Wood);
*/


 

交通灯系统需求:

具体需求如下:

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

例如:

       由南向而来去往北向的车辆---- 直行车辆

       由西向而来去往南向的车辆---- 右转车辆

       由东向而来去往南向的车辆---- 左转车辆

       。。。

  • 信号灯忽略黄灯,只考虑红灯和绿灯。
  • 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
  • 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

  • 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
  • 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
  • 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

 

 

看题目要求:信号灯忽略黄灯,只考虑红和绿灯,所以这里只有两种状态。

再参照日常生活中的十字路口,交通情况,得知:共有12条车辆通行路线。

 

 

 

思路分析:找类,灯、控制器、路(由于路上的车辆来来往往,有进有出,所以这里可作为数据使用)

灯:

1、12条路线,应该有12个路灯,固定数目,可以用枚举类型表示,方便操作;

2、有控制红灯亮的方法,控制绿灯变亮的方法,判断是否为绿灯的方法;

3、红灯亮时,它的下个灯应该变绿;

4、四条主线路,控制着四条对应线路的信号灯;

5、车辆右转弯没有限制,所以右转弯的信号灯应该是全亮的。

 

代码如下:

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 boolean lighted;//灯的状态,true为绿,false为红
	private String next;//下个灯
	private String opposite;//对面的灯
	
	//灯的初始化构造函数
	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;
		if(opposite != null) {
			Lamp.valueOf(opposite).light();//递归;
		}
		System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
	}
	//某灯为红灯时,它对面的灯也要变红,并且下一灯要变绿,并返回下一个灯
	public Lamp lightOut() {
		this.lighted = false;
		if(opposite != null) {
			Lamp.valueOf(opposite).lightOut();
		}
		
		//下一灯要变绿
		Lamp nextLamp = null;
		if(next != null) {
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从" + name() + "-------->切换为" + next);			nextLamp.light();
		}
		
		return nextLamp;
	}
}


控制器:

1、控制器一启动,就应该有条路线上的灯变绿。

2、控制器内应该有一个定时器,来控制灯的状态,即控制红绿灯间隔时间。

代码如下:

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();
		
		//定时器:每10秒钟将当前灯变红,并且将下一个灯变绿;
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				//周期要做的事
				new Runnable(){

					@Override
					public void run() {
						System.out.println(System.currentTimeMillis());
						//返回的下一个灯作为当前灯
						currentLamp = currentLamp.lightOut();
					}
					
				}, 
				10, //第一次执行的延迟时间
				10, //周期为10秒
				TimeUnit.SECONDS//周期的单位
		);
	}
	
	
}


路线:

1、路线的方向应该和信号灯的方向一致
2、路线上应该随机产生车辆,和实际情况相似

3、路线上也应该有个定时器,每过一秒即查看该路线是否可以通过,是则放行车辆。

注意:放行车辆时,应首先判断路上是否有车辆。

代码如下:

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 String name;
	List<String> vehicles = new ArrayList<String>();
	
	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);//随机主算法
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					vehicles.add(Road.this.name + "————" + i);//添加到某条路上的"集合中"
				}
			}
			
		});
		
		//每隔一秒钟判断一次当前线路上灯是否为绿灯,是则放行车辆
		//用定时器
		ScheduledExecutorService  timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable() {

					@Override
					public void run() {
						if(vehicles.size() > 0) {//某条上有车
							boolean Lighted = Lamp.valueOf(Road.this.name).islighted();//是不是绿灯							if(Lighted) {
								System.out.println(vehicles.remove(0) + "...is going");//放行
							}
						}
					}
					
				}, 
				1, 
				1,//周期1秒,过一秒查看一次。 
				TimeUnit.SECONDS
		);
	}
}


主函数:

1、产生12条路线

2、启动控制系统。

代码如下:

public class MainClass {

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

}


 效果:

N2S lamp is green,下面总共应该有6个方向能看到汽车穿过!
S2N lamp is green,下面总共应该有6个方向能看到汽车穿过!
W2S————0...is going
S2N————0...is going
N2S————0...is going
N2S————1...is going
S2E————0...is going
W2S————1...is going
E2N————0...is going
S2N————1...is going
N2S————2...is going
S2E————1...is going
N2W————0...is going
N2W————1...is going
1343915995234
绿灯从S2N-------->切换为S2W
N2E lamp is green,下面总共应该有6个方向能看到汽车穿过!
S2W lamp is green,下面总共应该有6个方向能看到汽车穿过!
S2W————0...is going
N2E————0...is going
S2W————1...is going
S2W————2...is going
N2E————1...is going
S2E————2...is going
E2N————1...is going
S2W————3...is going
W2S————2...is going
S2W————4...is going
N2E————2...is going
N2W————2...is going
N2E————3...is going
1343916005234


 

 

 

 

 

 

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

 详情请查看:http://edu.csdn.net/heima

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值