黑马程序员_交通管理系统学习总结
来源:互联网 发布:2016淘宝彩票是真的吗 编辑:程序博客网 时间:2024/06/05 10:24
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1、面向对象设计的一个重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。
2、在进行面向对象设计时,先理清事物存在的原因(通过画图可以更好的理解),在将涉及到的事物,抽象成对象, 确定每个对象自身的特征及动作,封装对象,进行对象设计(尽量面向接口编程,提高继承、多态)。
3、当程序涉及多线程时,出现问题,可能是因为某个线程或某代码块错误导致(异常),如果这个错误没有使用catch 块处理,那么因为多线程(异常)很可能不会显示出来,导致找不到错误。可以加入catch检查代码。
交通灯例题:
面向对象的分析与设计
每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。
设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
每条路线上随机增加新的车辆,增加到一个集合中保存。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。
总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。
无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。
设计一个LampController类,它定时让当前的绿灯变红。
package com.K7.traffic2;
import java.util.ArrayList;
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 {
ArrayList<String> car=new ArrayList<String>();
//路名称,对应的灯
private String name;
Road(String name){
this.name=name;
//10秒内随机增加车辆
ExecutorService addCar=Executors.newSingleThreadExecutor();
addCar.execute(new Runnable(){
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
car.add(Road.this.name+"---"+i);
}
}
});
//每秒从集合里移除车,代表路口通过的车
ScheduledExecutorService removeCar= Executors.newScheduledThreadPool(1);
removeCar.scheduleAtFixedRate(
new Runnable(){
public void run(){
Lamp lamp=Lamp.valueOf(Road.this.name);
if(lamp.isLighted()){
if(!(car.isEmpty())){
System.out.println(car.remove(0));
}
}
}
}
TimeUnit.SECONDS);
}
}
package com.K7.traffic2;
public enum Lamp {
//定义4组轮询灯
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
//对应上面4组灯
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
//方便扩展定义4个不需要控制的右拐灯
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
//对应的灯
private String opposite;
//下一个灯
private String nextLamp;
//灯的状态
private boolean lighted;
Lamp(String opposite,String nextLamp,boolean status){
this.opposite=opposite;
this.nextLamp=nextLamp;
this.lighted=status;
}
Lamp(){
}
//查询灯的状态是否为true亮
public boolean isLighted(){
return lighted;
}
//设置这个灯和对应的灯都为亮
public void light(){
lighted=true;
if(opposite!=null)
Lamp.valueOf(opposite).light();
System.out.println(name()+"等亮了");
}
//设置这个灯和对应的灯为灭,下一个灯亮,并返回下一个灯
public Lamp blackput(){
lighted=false;
if(opposite!=null)
Lamp.valueOf(opposite).blackput();
System.out.println(name()+"灭了--");
Lamp next=null;
if(nextLamp!=null){
next=Lamp.valueOf(nextLamp);
next.light();
}
return next;
}
}
package com.K7.traffic2;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp=Lamp.S2N;
LampController(){
currentLamp.light();
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println(currentLamp+"----LampController");
currentLamp=currentLamp.blackput();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
package com.K7.traffic2;
public class MainClass {
public static void main(String[] args){
String[] road=new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(String r:road){
new Road(r);
}
new LampController();
}
}
以上便是自己的一些总结,希望大家多多提出意见,我们共同进步。----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看:
- 黑马程序员_交通管理系统学习总结
- 黑马程序员_交通管理系统
- 黑马程序员_交通管理系统
- 黑马程序员_交通管理系统
- 黑马程序员_java学习日记_交通管理系统
- 黑马程序员_交通管理系统DAY16
- 黑马程序员--交通管理系统
- 黑马程序员-----交通管理系统
- 黑马程序员,交通管理系统
- 黑马程序员 交通管理系统
- 黑马程序员 交通管理系统
- 黑马程序员----交通管理系统
- 黑马程序员--交通管理系统
- 黑马程序员 <交通管理系统>
- 黑马程序员---交通管理系统
- 黑马程序员_张老师的交通管理灯系统
- 交通管理系统学习总结
- 黑马程序员—交通管理系统
- Matlab与C++接口与混合编程讨论小结
- python实现单例模式__init__ __new__区别
- ROI区域图像叠加&初级图像混合
- perl学习笔记一----变量
- html5标签
- 黑马程序员_交通管理系统学习总结
- redis set轻松做排行榜应用
- 获得iPhone应用程序私有目录地址
- Android版本百度地图开发(六)——Place详情页
- Linux下vi编辑器操作文件内容的命令
- [Perforce系列—] 1. 使用Perforce 命令 与常用命令
- Cocos2dx制作2048(1.搭建主框架)
- 什么是MES
- 解决uploadify buttonimg 按钮图片加载延迟办法[百度搬家]