黑马程序员——总结:交通灯管理系统

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

一,要通过分析问题来简化问题:
1、四个方向的车,每个方向都有左转、右转、直行三条线路,但是南与北、东与西是相同情况,所以可以只考虑南方和东方的车的方向,简化了问题。

2、由于左转、直行受到灯的控制,右转是不受灯控制,使问题复杂,所以假设右转也需要看灯,只是设定一个长绿的灯来控制右转,从而统一了思想。

3、由于路线太复杂,容易使人考虑晕。所以先只考虑一个方向的车,做完一个方向再去考虑另一个方向。使思路更清晰。


二,面向对象的设计:
1、需要用到的对象:红绿灯、红绿灯的控制系统、汽车、路线。

2、分析:汽车在什么条件下可以穿过路口?灯变绿,而且前面没有车的时候。

3、车在穿过路口的时候需要问谁?问路,路相当于一个集合,每一个车走的时候都要判断这个集合前面是否还有元素。而且路的对象中也需要提供增加和减少车辆的方法。

4、方法操作的数据在哪个类身上,就把方法定义在哪个类上。
 例:人在黑板上画圆:画圆需要圆心、半径等,都在圆身上,所以画圆方法应该定义在圆上;
 司机刹车:司机只是踩了一下刹车,真正刹车的一系列动作实际是车的内部操作,所以刹车方法应定义在车上;
 售货员统计商品小票价格:价格都是装在了小票上,因此统计价格方法应定义在小票类中;
 人关门,关门的动作需要旋转门、撞到门框、自动锁上门锁,都是门在做,因此关门方法需要定义在门上。

5、由于题目的目的是要体现车辆穿过路口的过程,而不是在描述汽车的移动,所以不必为汽车创建对象,只需要一个字符串表示就可以。

6、工厂模式:两块石头磨成一把石刀,可以砍树,砍成木材,木材做成椅子。
 思路:石头变成石刀以后,石头不存在了;木材变成椅子以后,木材也不存在了,因此我们可以认为是有一个工厂来提供方法生产他们:

	StoneKnife sk= KnifeFactory.createKnife(Stone first,Stone second)
	Chair chair = ChairFactory.makeChair(Material material);

7、由于一共只有12个灯,不会变,所以使用枚举创建12个交通的对象。

 

三,类的编写:
路类Road:

public class Road{
	private List<Stirng> vehicles = new ArrayList<String>();
	
	private String name = null;
	public road(String name){
		this.name = name;

		ExcutorService pool = Excutors.newSingleThreadExecutor();
		pool.excute(new Runnable(){
			public void run(){
				for(int i = 1; i<1000; i++){//每隔1-10秒钟,就会在路上出现一辆车
					try{
						Thread.sleep((new Random().nextInt(10) + 1) * 1000);//设置一个随机值,让线程睡眠1-10秒钟
					}catch(InterruptedException e){
						e.printStackTrace();
					}
					vehicle.add(Road.this.name + " " + i);
				}
			}
		});
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//创建调度池对象

		timeer.scheduleAtFixedRate(new Runnable(){
			public void run(){
				if(vehicles.size()>0){
					boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
					if(lighted){//当为绿灯时,将第一辆车移出。
						System.out.println(vechicles.remove(0) + " is traversing !");
					}
				}
			}
		},
		1,
		1,
		TimeUnit.SECONDS);
		timer.schedule(new Runnable(){},
		1,
		unit);
	}
}

 

灯类Lamp:

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 opposite;//对应的灯
	private String next;//下一个灯

	private Lamp(String opposite, String next, boolean lighted){ //构造方法,第一个参数为与之一起亮的灯,第二个参数是下一个亮的灯,第三个参数化为当前是红灯还是绿灯。
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}

	private Lamp(){
		
	}

	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个方向能看到汽车穿过");//name()方法是枚举类的方法,可以获得当前枚举对象名字。
	}

	public Lamp blackOut(){//变红灯
		this.lighted = false;
		if(opposite != null){//将对应的灯也变红
			Lamp.valueOf(opposite).blackOut();
		}

		Lamp nextLamp = null;
		if(next != null){//将下一个灯变绿
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从" + name() + "--->切换为" + next);
			nextLamp.light();
		}

		return nextLamp;//返回变绿的灯对象。
	}

}


灯控制器类LampController

public class LampController{
	private Lamp currentLamp;

	public LampController(){
		currentLamp = Lamp.S2N;
		currentLamp.light();

		ScheduleExecutorService timer = Executors.newScheduleThreadPool(1);

		timer.scheduleAtFixedRate(
			new Runnable(){
				public void run(){
					currentLamp = currentLamp.blackOut();
				}
			},
			10,//10秒钟以后
			10,//以后每隔10秒钟
			TimeUnit.SECONDS);
	}
}


主方法测试MainClass:

public class MainClass{
	public static void main(String[] args){
		
		String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		for(String direction : directions){//创建12个路线类。
			new Road(direction);
		}

		new LampController();
		
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值