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

        ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

        用面向对象的思想设计交通灯管理系统,首先要明确对象是什么.张老师有几个面向对象的经典例子,在这里,我也将它例举出来.

        1.人在黑板上画圆:圆才是画这个方法的对象,因为画出圆需要半径和圆心,这些数据只在圆上拥有

        2.人关门,关门这个动作的对象是门上的,因为门拥有门轴,门栓等资源

        3.列车司机刹车,刹车这个动作的对象是列车,因为列车拥有刹车闸.

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

        放到这个系统中分析,我们可以找到几个对象分别是红绿灯,红绿灯的控制系统和路,因为路拥有车,它提供的是车辆增加和减少的方法

        从这三个对象入手,可以分解出整个系统的思路.

        一.创建灯

        一个路口有4个方向,每个方向有3种选择,因此总共有12条路,即有12展灯.向右转的4个方向没有灯,为保持系统的一致性,将它假定为常绿灯.其余8展互对的为一组,即分成4组,因为互对的灯是一样颜色的,因此只将一面的灯作为控制灯.当设定一个灯为绿灯时,对面的灯也是绿灯,旁边的灯则转为红灯,代码如下:

package net.csdn.interview;
/**
 *
 * 因为有12个固定的灯,所以用枚举来写灯
 *
 */
public enum Lamp {
 //通过画图得到方向
 S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2E","N2N",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 Lamp(String oppsition, String nex,boolean lighted) {
  this.oppsition = oppsition;
  this.lighted = lighted;
  this.next = next;
 }
 private Lamp(){}
 private boolean lighted;//定义亮着的就是绿灯
 private String oppsition;// 定义对面的灯
 private String next;
 public boolean isLighted(){  //判断是否为绿灯
  return lighted;
 }
 public void light(){  //灯提供一个变亮的方法
  this.lighted = true;
  if (oppsition!=null) {  
   Lamp.valueOf(oppsition).light(); //用枚举的方法将对面的灯变亮   
  }
  if (next!=null) {  

   Lamp.valueOf(next).blackLight(); //让下一个灯变黑
  }  
 }
 public Lamp blackLight(){  //灯提供一个变黑的方法
  this.lighted = false;
  if (oppsition!=null) {  //没明白
   Lamp.valueOf(oppsition).blackLight();
  }
  Lamp nextLamp = Lamp.valueOf(next);
  if (next!=null) {  //没明白
   nextLamp.light();  //下一个灯变亮
  }
  return nextLamp;
 }
}
       二.创建路

       路上有增加和减少车辆的方法,增加车辆实在1-10秒内随机的产生车辆数目,减少则是根据灯是否为亮这个判断条件,里面用到了线程池的概念,具体代码如下:

package net.csdn.interview;

import java.util.ArrayList;
import java.util.List;
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 {
 List vechicles = new  ArrayList();
 private String name;
 public Road() {
  super();
 }
 public Road(String name) {
  this.name = name;  //以方向命名
  ExecutorService pool = Executors.newSingleThreadExecutor(); //创建一个使用单个 worker线程的 线程池
  pool.execute(new Runnable(){  //开线程
   @Override
   public void run() {
    for (int i = 0; i < 1000; i++) {
     try {
      Thread.sleep(new Random().nextInt(10)+1*1000); //1到10秒内会随机出现一辆车
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     vechicles.add(Road.this.name+"第"+i+"辆车"); //把车添加到路上
  }
   }
  });
  //当绿灯两时,要将车从马路上移除,自定义时间为1秒
  //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
  ScheduledExecutorService ses= Executors.newScheduledThreadPool(1);
  ses.scheduleAtFixedRate(new Runnable(){
        @Override
        public void run() {  //每隔一秒移除一辆车,并且是循环的移
         if (vechicles.size()>0) {//判断路上有车
          boolean light = Lamp.valueOf(Road.this.name).isLighted();//设定等是绿的,车可过行
          if (light) {
           vechicles.remove(0);//把车从路上移走
          }          
         }
        }       
        },
        1,
        1,
        TimeUnit.SECONDS);
 }

}

        三.创建灯的控制器

        先记录一盏灯,给它设定亮的时间是10秒,之后让当前的灯变黑,返回下一个灯,让下一个灯变绿,这是就需要对灯那个类做出一点修改,把变黑的方法改成返回下一个灯.代码如下:

package net.csdn.interview;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 *
 * 定义一个灯的控制器,让它每隔10秒变一次
 *
 */
public class LampController {
 private Lamp currentLamp; //定义一个当前的灯
 
 public LampController(){
  currentLamp = Lamp.S2N;  //记录一盏灯作为当前灯
  Lamp.valueOf("S2N").light(); //把当前灯点亮
  //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
  ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
  ses.scheduleAtFixedRate(
    new Runnable(){
     @Override
     public void run() {
      currentLamp = currentLamp.blackLight();
     }
    },
    10,
    10,
    TimeUnit.SECONDS);
 }
}

最后测试代码

package net.csdn.interview;

public class Test {
 public static void main(String[] args) {
  String[] directions = new String[]{  //找到所有的灯  
   "S2N","S2W","E2W","E2S","N2S","N2E","W2N","W2N","S2E","E2N","N2W","W2S" 
  };
  for (int i = 0; i < directions.length; i++) {
   new Road(directions[i]);  //把灯放在路上
  }
  new LampController();  //开启灯的控制器
 }
}

       总结:思路清晰后,代码不会特别难,关键还是面向对象的思想问题,要找到作用的是哪几个对象.灯的方位问题画图之后就很清晰了,但是有些特殊的地方还是要注意,代码还是不很熟练,
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值