您的位置:首页 > 职场人生

黑马程序员_交通灯管理系统笔记

2014-03-19 21:01 162 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
学习张孝祥老师交通灯管理系统笔记

交通灯管理系统需求:交通灯管理系统的项目需求 异步随机生成按照各个路线行驶的车辆。

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

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

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

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

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

面向对象的方法

谁拥有数据,谁就对外提供操作这些数据的方法。

eg:人在黑板上画圆。有人,圆两个对象。画圆的方法在圆中,因为画圆涉及的圆的半径坐标这些数据封装在圆中。

列车司机紧急刹车。有列车,有司机。刹车这个方法是列车里面的。

售票员统计收获小票的金额。有人,有小票。统计小票金额这个方法是小票提供的。人只是调用小票的gettotalmoney()这个方法

你把门关上了。关门的动作是门自己的。

球从一根绳子的一段移动到了另一端。

球作为一个类。球里面有绳子对象,通过构造函数传递进来。有当前点的属性。有移动的方法,是通过调用绳子的下一点方法来移动。

绳子也是一个类。开始点,结束点。有下一点的方法。

这样子,就可以把绳子和球绑定在一起了。

两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子。

石头怎么变石刀呢?通过工厂类的方法。

石头 Stone

石刀 StoneKnife

StoneKnife knife=KnifeFactory(Stone);

树=knife.cut()//石刀砍树

木材=木材工厂(树)

椅子=椅子工厂(木材)

面向对象分析与设计

1.首先要理清楚十字路口的交通情况。



2.提取类和对象

(1)有路,有车,有路灯。

(2)首先路上有车,因为这里只是模拟一下车的实现路过,所以没必要把车写成一个类,直接用String字符串表示即可。因为车是属于路的数据。所以路这一个类要有增加车和删除车的方法(即车开走)。

(3)路上会有灯,一共有12个方向的路线,图中红色线实际情况是没有灯的。但为了简化代码,我们可以假设那红色路线处有一盏常亮的灯。另外,分析图可以发现,当S2N的灯亮时,S2N对面的灯N2S也会亮。这样子我们可以简化为四组灯了。S2N和N2S为一组,E2W和W2E为一组,S2W和N2E为一组,E2S和W2N为一组。可以将灯定义为枚举类,里面包含了12盏灯的名字。

灯有是否亮的状态属性

有灯变绿的方法。灯变变红的方法

当一灯亮时,和它同一组的灯也会亮(即为绿灯)。当灯灭时(即为红灯)和它同一组的灯也灭,同时下一组灯亮。

(4)有灯的控制类,来调用灯的变亮和变灭的方法,使得灯能循环变亮变灭。

(5)设计主类,初始化12条路,初始化灯的控制类。就相当于把路创建出来,车子随路出来。红绿灯启动起来。车子看红绿灯的情况运行。

代码实现的小总结

实现方法

1.Rode路线作为一个类。路线上有车(车子用ArrayList集合装起来,用一个线程每隔在1秒到10秒的时间间隔内在集合里给路线添加一辆车)。当该路线上的路灯变亮的时候,该路线上排第一位的车子可以移动(开另一个线程来判断该路线路灯是否亮,如果亮,移除车子集合第一辆车子移动)。

2.关键:Lamp路灯,(由于用到的路灯都是一个实例所以用枚举)。封装了12种路线,其中四条路线可以假设是路灯常绿的,因为不需要看红绿灯就可以过。路灯有变亮方法和变暗方法(相当于变红灯)。方法一:某灯亮时,对面的灯也亮(注意不能死循环)。方法二:某灯暗时,对面的灯也暗,(可以返回下一个亮的路线,后面可以用到)。

3.路灯的控制类,用线程使每隔十秒,当前路线上的路灯亮。之后返回当前路线。使四条路线不断的循环。

4.主类,实例化12条路,实例化路灯控制类。

jdk1.5以后创建线程的新方法

Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Rode.this.name + "_" + i);
}
}

});


线程池的意思和数据库的连接池意思差不多,都是在一个线程池里面一下子创建了很多链接,你要调用线程的时候就找池,池会自动帮你选择一个线程来调用的。

这个在(银行调度有说了,不详细说了)。

编码易错点

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 islighted;
private String opposite;
private String next;

private Lamp(String opposite, String next, boolean islighted) {

this.opposite = opposite;
this.next = next;
this.islighted = islighted;
}


1.在实现枚举类的时候,记得初始化每一个类对象的时候,即初始化
S2N("N2S", "S2W", false)
是,要传String进来,不能直接传一个Lamp进来,因为这样会有编译错误。会出现该对象还没调用就被使用的情况。

2.同时你把下面这两个属性定义为Lamp类型,参数传进来是String类型,在构造函数里面用枚举的方法转换为Lamp,这样也不对的。虽然编译没错,但是执行的时候,会出现找不到类的情况。原因和上面的原因一样。

private String opposite;
private String next;



----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: