看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

 

黑马程序员_7K月薪面试题破解之一_交通灯管理系统

交通灯管理系统
  • u013921901
  • u013921901
  • 2014年04月07日 20:43
  • 656

黑马程序员——7K月薪面试题破解之二_银行业务调度系统

------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1. 银...
  • yuanqiwyj
  • yuanqiwyj
  • 2014年09月07日 10:44
  • 493

黑马程序员-张孝祥-7K月薪面试题破解之一_交通灯管理系统

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 1.具体需求: ...
  • kevincharles
  • kevincharles
  • 2013年12月09日 11:43
  • 947

面试题(面向对象程序设计)

以下内容转载自C#与.net面试宝典 1.对象 1.1 类和结构有什么区别? 定义和使用非常相似,例子如下: public struct Student {     string Name;     ...
  • xc917563264
  • xc917563264
  • 2017年03月20日 15:44
  • 310

Js核心面向对象面试题

1.网页三要素是什么 Icon HTML(内容) CSS(外观) Javascript(行为) 2.JavaScript是什么 Icon JavaScript一门解释型(不是编译...
  • t0404
  • t0404
  • 2016年07月12日 22:43
  • 9173

面试百题001——谈谈你对面向对象编程的认识

面向对象程序设计的基本概念:面向对象, 概括地说, 就是把问题抽象为对象, 设置属性(数据) , 指定事件或处理方式(代码) 来达到目的, 强调从问题域的概念到软件程序和界面的直接映射。面向对象程序设...
  • seven_13
  • seven_13
  • 2013年08月29日 15:34
  • 4971

面向对象_两个面试题

1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象。 方法重载: 同一个类中,出现方法名相同,参数列表不同的现像 方...
  • L1585931143
  • L1585931143
  • 2016年10月01日 22:20
  • 346

前端复习--js面向对象的理解

这周一通过去闪银面试,和做熊猫的题,我发现,自己对js面向对象的理解,其实是 停留在很初级的层面上,需要不是几道面试题能解决的,我需要的是一本书。这本书目前是找到了:Oriented-object  ...
  • hellokingqwe
  • hellokingqwe
  • 2016年10月19日 00:27
  • 1698

Java 面向对象 面试题

1、封装具有的特性? 答:(1)在类的定义中设置访问对象属性(数据成员)及方法(成员方法)的权限,限制本类对象及其他类的对象使用的范围。 (2)提供一个接口来描述其他对象的使用方法 (3)其他对...
  • pink1253157935
  • pink1253157935
  • 2014年08月07日 23:19
  • 3310

男人,如何洞悉女人的内心世界笔记

女人是爱的化身 女人的幸福和爱连在一起 爱对于女人来说很重要,会很好的经营爱,在爱中会付出很多。 女人的爱情被背叛了,女人会产生恨。 第二章在交往中观察女人 需要尊重他,尊重他家人 有...
  • dugaoda
  • dugaoda
  • 2015年04月08日 16:07
  • 608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:看7k面试题洞悉面向对象的重要性
举报原因:
原因补充:

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