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

来源:互联网 发布:怎么用js编写拖拽插件 编辑:程序博客网 时间:2024/04/29 02:05


   -----------------------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

 

原创粉丝点击