对于交通灯系统的学习

通过这个项目,我的主要收获有:

1.对于Executors定时器的应用

2.对于面向对象编程的思想有更深入的理解

3.了解了需求分析--代码编写的过程。

    我觉得听过之后,虽然有了认识,但是自己再做一遍能更加深记忆。同时能在实践过程中,发现问题,解决问题。

下面是我自己实践的过程:

首先分析需求,可以借助画图,这有助于更好的理解。

然后,类的设计:

灯,Lamp枚举,封装了12个红绿灯及其的改变方式。

路线,Road类,封装增加删除车辆的方法,其中增加构造器中实现(线程,避免难产),删除在定时器中实现

交通灯控制器,LampControler,一个定时器,每隔一段时间改变红绿灯。

 其中对于定时器的实现之前没有接触,所以我赶紧借助API学习了下。

实现Lamp 交通灯方向要借助于画图,否则很容易搞混。其中右拐设置为常绿,其余8个可以两个为一组(状态一致),分别为【N2S,S2N】,【E2W,W2E】,【W2N,E2S】,【S2W,N2E】.

理清了思路之后,发现整个程序的运行就是3个线程,一个增加车辆(在构造器中实现),一个减少车辆(定时器,并且要判断方向灯是否亮了),一个负责交通灯的转换。

    根据上述思路,我编写好了代码。但并不是很顺利,遇到了些问题。

1.哪里要进行同步?由于是road操作车辆,LampControler操作Lamp的切换,并没有共享数据,所以不用担心多线程的安全问题。

2.车辆放行时,未进行判断灯是否亮了?这个判断将两个线程连接起来,要加Lamp.valueOf(Road.this.name).isLighted()这个判断,满足条件才可以放行。

3.随机上路时未增加随机数?Thread.sleep((new Random.nextInt(10)+1)*1000)

4.枚举的构造器不能加public修饰符。

5.Lamp.valueOf()方法需要判断,因为有可能传进去的参数错误。

6. 还有关于面向对象的新认识,像“小球从绳子的一端到另一端”这个例子让我印象深刻,将其纪录下来备忘。

class Rope{
	private int startPoint;
	private int enndPoint;
	public Rope(int startPoint ,int endPoint){
		this.startPoint = startPoint;
		this.enndPoint = endPoint;
	}
	public int nextPoint(){//谁拥有数据,谁就提供操作数据的方法
		return new Random().nextInt();
	}
}
class Ball{
	private Rope rope;
	private int currentPoint;
	public Ball(Rope rope,int currentPoint){
		this.rope = rope;
		this.currentPoint = currentPoint;
	}
	public void move(){
		currentPoint = rope.nextPoint();
		System.out.println("小球移动到了"+currentPoint);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值