看7k面试题洞悉面向对象的重要性

原创 2012年03月26日 22:20:17


   -----------------------android培训java培训java学习型技术博客、期待与您交流!------------------

      看完了张老师讲的交通灯管理系统,心情还是有点小激动,原来这就是真正的项目开发,整理好心情,来回顾一下张老师是如何分析设计的。
      在实际的开发中写程序之前的分析阶段也是非常重要的,找出将要实现的对象,操作的数据,实现的功能,才能开发出高效实用的软件。在本例中,要求设计实现十字路口的交通灯管理系统逻辑,具体要求如下:
    1,异步生成按照各个路线行驶的车辆。
    2,信号灯忽略黄灯,只考虑红灯和绿灯。
    3,每辆车通过路口时间为1秒,可通过sleep模拟。
     首先,要知道总共有多少有多少条路线(说实话,这个真的很多人都不知道,包括我),通过画图,分析出总共12条路线,那么就要在系统中实现12个Road对象,每条路上随机增加车辆,在集合中保存,每条路线每隔一秒检查控制灯,如果本条路线上是绿的,则移除保存在本集合中的车辆,如果没有车辆就不移除。
    public class Road {设计一个Road类在需要时创建实例对象
 private String name;
 List<String> vechicles = new ArrayList<String>();
 public Road(String name){
  this.name = name;
  class MyThread extends Thread{//每条路线上随机生成车辆,是自动生成,所以要用到多线程技术,重写run()
   public void run(){
    for(int i=0;i<50;i++){
     try {
      Thread.sleep((new Random().nextInt(10)+1)*1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     vechicles .add(Road.this.name+"_"+i);
    }}}
  class MyThread1 extends Thread{//每隔一秒检查对应的灯是否为绿,是则放行一辆车,也需要多线程处理
   public void run(){
   while(true){
    try {
     Thread.sleep(1000);
     if(vechicles.size()>0){     
      boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
       if(lighted){       
        System.out.println(vechicles.remove(0)+" 正常驶离十字路口");
       }}
    } catch (InterruptedException e) {
     e.printStackTrace();
     }
    }};
   }
     new MyThread1().start();
  new MyThread().start();
 }}
    接着就是交通灯的设计,因为在不考虑黄灯的情况下,只有两个状态,可以考虑用枚举方法实现,总共有12条路线,所以总共有12个交通灯,其中右拐弯的车辆不受交通灯控制,假设这些灯一直是绿色的,另外8条路线都是两两成对的,所以可以分为四组,这四组灯依次轮流变成红色,设计一个Lamp枚举类如下:
    public enum Lamp {
 S2N("N2S","S2W",false),S2W("N2E","W2E",false),W2E("E2W","E2S",false),E2S("W2N","S2N",false),
 N2S(null,null,false),N2E(null,null,false),E2W(null,null,false),W2N(null,null,false),
 S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);//总共设计12个等,分为4组,由其中4个控制
 
 private String oppsite;
 private String next;
 private boolean lighted;
 private Lamp(String oppsite,String next,boolean lighted){
  this.oppsite=oppsite;
  this.next=next;
  this.lighted=lighted;
 }
 public boolean isLighted(){//判断是否为红灯
  return this.lighted;
 }
 public void greenOn(){//变绿
  this.lighted=true;
  if(oppsite!=null){把对应的相反方向也变绿
   Lamp.valueOf(oppsite).greenOn();
  }
  System.out.println(name() + "方向是绿灯 ,下面总共应该有6个方向能看到汽车穿过!");
 }
 public Lamp redOn(){//变红
  this.lighted=false;
  Lamp nextLamp=null;
  if(oppsite!=null){//把对应的相反方向也变红
   Lamp.valueOf(oppsite).redOn();
  }
  if(next!=null){//把对应的下一个方向也变绿
   nextLamp=Lamp.valueOf(next);
   nextLamp.greenOn();
  }
  return nextLamp;
 }
}
    /*再设计一个类用来控制交通灯的变化*/
    public class LampController {
 private Lamp currentLamp;
 LampController(){
  currentLamp=Lamp.S2N;
  currentLamp.greenOn();
  while(true){
   try {
    Thread.sleep(5000);
                currentLamp = currentLamp.redOn();
   } catch (InterruptedException e) {
    e.printStackTrace();
   } 
  }
 }
}
     最后就是写一个MainClass方法运行程序,实际上整个程序分为两个模块,独立运行,一个交通灯模块,一个线路控制汽车的模块,
    public class MainClass {
 public static void main(String[] args) {
  String[] directions = {"S2N","S2W","W2E","E2S","N2S","N2E","E2W","W2N","S2E","E2N","N2W","W2S"};
  for(String st : directions ){//实现12条路线
   new Road(st);
  }
  new LampController();开启交通灯系统
        }}
    经过实例的学习,得到一个最重要的经验就是面向对象的设计,可见面向对象思想对编程的巨大作用,真正写代码的时间不到1个小时,而分析对象可能就要几天时间,还是要重复一下前辈们的一句话,编程并不难,关键是思想,单纯的技术并不难学,如果能做到举一反三,学会分析,才能达到高手的境界。

 


-----------------------android培训java培训java学习型技术博客、期待与您交流!----------------------

详情请查看:http://edu.csdn.net/heima

 

相关文章推荐

Java基础---Java---面试题---交通灯管理系统(面向对象、枚举)

交通灯管理系统的项目需求:

常规面试题-3.面向对象

1.面向对象有哪些特征1.抽象:忽略一个主题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面。 2.继承:一种联结类的层次模型,并且允许和鼓励类的重用。...

《java入门第一季》之面向对象(一个易错面试题)

这个面试题有点难度,有一些饶。不明白可以在下面讨论。还是值得搞懂的。 / * 看程序写结果: A:成员变量的问题 int x = 10; //成员变量x是基本类型 Student ...

OOP(面向对象面试题)

OOP(面向对象) 1:说出一些常用的类,包,接口,请各举5个 常用的类:BufferedReader  BufferedWriter  FileReader  FileWirter  Strin...
  • nysyxxg
  • nysyxxg
  • 2013年04月08日 20:32
  • 2653

java面向对象面试题(2)

1) 给定如下java代码程序片断:        class A{               public A(){                      System.out...

最近很火的一道 面向对象的面试题 ——携程Java工程师(SBU)

该题目源自微信公众号(程序员的那些事)的推送:携程 Java 工程师的一道面向对象面试题 题目是这样的:求下面程序的输出: 最近这道面试题,传遍程序员各大小园地,本小白特摘抄整理与大家一起学习:...
  • singit
  • singit
  • 2015年10月10日 14:06
  • 1901

java面向对象面试题(1)

1) 当试图编译并运行下面程序时会出现什么结果()(单选)     class A{          public int getNumber(int a){            ...

面试题-谈谈对面向对象的理解

简要介绍: Object - Oriented Programming  简简称OOP,是一种程序设计泛型,同时也是一种程序开发的方法。类是对具有相同属性和方法的事务的抽象,对象是类的实例。OOP将...

黑马程序员——java基础面试题之面向对象

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 ...
  • DoSamba
  • DoSamba
  • 2016年01月01日 04:42
  • 678

《java入门第一季》之面向对象面试题(成员变量与局部变量的区别)

/* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:看7k面试题洞悉面向对象的重要性
举报原因:
原因补充:

(最多只允许输入30个字)