[置顶] 看张孝祥老师交通灯程序小总结

---------------------- android培训、java培训、期待与您交流! ----------------------

交通灯管理系统是一个小项目.做项目不要着急写代码,代码只是一种表现形式而已.我们需要掌握设计对象的思想,下面是看张老师视频中的几个案例.
1:人在黑板上画圆.画圆的方法应该是在圆中的,因为数据在圆自己里面(圆心坐标点,与半径),人只是去调用方法.
2:列出司机紧急刹车.刹车的动车肯定车是最清楚的,所以刹车的方法应该再车里面.通过人对象调用
3:售货员统计收获小票的金额.小票的金额小票本身肯定最清楚因为数据都在小票上(每个商品的金额)最后再定义一个求和方法就可以了.
两个面向对象的面试题.
1:两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子.

首先定义这几个变量.
Stone First
Stone second
将石头变成石刀石头就没有了,所以这不是石头里面的方法.
这里就有要有一个制作刀的工厂,工厂就有制作刀的方法,接受的是这两个石头返回的类型就是石刀
所以石刀就可以写成
StoneKnife=KnifeFactory.createKnife(Stone First,Stone second)
StoneKnife
石刀就应该有砍树的功能,接受的是tree返回类型就是木材
所以木材就可以写成:
material = StoneKnife.cut(tree)
tree
material
木材做成椅子,木材就没有了,所以木材不应该有做成椅子的方法.
所以就应该有个椅子工厂,工厂就有制作椅子的方法,接受的就是木材
所以椅子就可以写成
chair = ChairFactory.makeChair(tree)
chair
2:球从一根绳子的一段移动到另一端.
分析应该有2个对象,一个是绳子 Rope,一个是球Ball
class Rope{
绳子就有长度,就应该有起始点,与结束点
所以定义2个变量
private Point start;
private Point end;
绳子的构造方法,即产生绳子就应当接受这两个变量起始点与结束点.
public Rope(Point start,Point end){
this.start=start;
this.end = end;
小球需要移动,绳子必须给小球移动到那个点的数据,所以小球就应当有个方法
给球计算移动的点的数据.
public Point nextPoint(Point currentPoint)//通过小球当前的点,计算小球下次移动的点{
//这里应该有计算方法.当这个点是终点的时候返回null,如果不是绳子上的点就抛出异常.
}
}

class Ball{
使得球与绳子产生联系,所以球中应应该有绳子
private Rope rope;
随着球的移动,就应该是移动在绳子上的某个点,所以就必须创建这个移动的点\
private Point currentPoint;
public Ball (Rope rope,startPoint){
this rope = rope;
this currentPoint = startPoint;//小球当前状况下在绳子上的点

}
 小球移动的方法
public void move(){
currentPoint = rope.nextPoint(currentPoint)//小球当前的点,是绳子计算出来的,通过绳子计算出移动的点就是绳子下个时候的当前点;
//打印绳子移动到了什么位置
sop("小球移动到了"+currentPoint );
}
}
}
下面是我参考张孝祥老师的视频跟着写的,并做了些注释.

//创建路对象

package Protect_TrafficLight;

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;

//创建路对象.路上有很多车辆,车辆就相当于元素,
//那么就可以把路就可以看成一个容器,那么路就可以可看成一个集合.
//集合有List集合,有Set集合,因为不用考虑集合中元素的排序问题可可重复问题
//这里考虑用List集合
public class Road {

 List<String> vehicle = new ArrayList<String>();//这里体现多态思想用子类实例对象创建对象
  //因为有12条路,给路起好名字才好车起名字,所以通过构造给路起名字
  private String name = null;
  public Road(String name){
   this.name = name;
   //假设路创建完后,随机的在路上增加车辆,假设每条路上每秒产生一辆车.假设产生1000辆车
   //这里使用JAVA5 的线程库创建线程.创建一组线程池.可以保证顺序执行任务
   ExecutorService pool = Executors.newSingleThreadExecutor();
   pool.execute(new Runnable(){

    @Override
    public void run() {
     for(int i=1;i<1001;i++){
      //每一秒中产生一辆车,我们很容易想到创建一个线程,让线程在这里沉睡1秒
                 //这里为什么不用Thread.sleep(1000),因为在这里睡住了,对象就无法返回了.
      try {
       Thread.sleep((new Random().nextInt(10)+1)*1000);
      } catch (InterruptedException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      vehicle.add(Road.this.name+" "+i);//这里是内部类想要访问外部类的成员变量外部类的成员变量必须用final修饰
      //这里访问外部类的变量可以使用外部类的名字加this使用
     }
    }
    
   });
    
   //创建一个定时器,每隔一秒车看灯是是绿的,如果是绿的,车就开走.
   ScheduledExecutorService time = Executors.newScheduledThreadPool(1);
   time.scheduleAtFixedRate(new Runnable(){

    @Override
    public void run() {
     if(vehicle.size()>0){
      boolean lighted = lamp.valueOf(Road.this.name).isLight();
      if(lighted){
  //这里就是返回那个开走的车.即返回的是集合的第一个对象vehicle.remove(0);
     System.out.println(vehicle.remove(0)+"开走了");
      }
     }
     
    }
    
   },
     1,
     1,
     TimeUnit.SECONDS);
  }
}

//用枚举定义灯

package Protect_TrafficLight;
//因为这些灯都是固定的.要想拿到这些灯,就必须使用规定的灯,所以使用枚举.
public enum lamp {
 //灯有12个.有四个灯是常绿的(右转弯的灯),有四个灯与它相对应的灯是状态是相同的.
 //所以主要定义好规定的四个灯就好了
 //自定义规定的四个灯
 S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 boolean lighted;//定义灯的状态.
 //private lamp opposite;定义下一个灯为什么不能这样用,
// 如果这样写了把对应的灯传给规定的灯的时候会出错,因为那个时候对应的灯还没创建出来
 private String opposite;
 private String next;//定义下一个灯
 public boolean isLight(){
  return lighted;
 }
 
 private lamp(String opposite,String next,boolean lighted){
  this.opposite=opposite;
  this.next=next;
  this.lighted=lighted;
 }
 
 public void light(){
  this.lighted=true;
  if(opposite!=null){
   lamp.valueOf(opposite).light();
   System.out.println(name()+"变绿了");
  }
 }
 
 public lamp black(){
  this.lighted=false;
  if(opposite!=null){
   System.out.println("绿灯从"+name()+"切换为"+ next );
   lamp.valueOf(opposite).black();
  }
  lamp nextlamp = null;
  if(next!=null){
   nextlamp = lamp.valueOf(next);
   nextlamp.light();
   
  }
  return nextlamp;
 }
}
//定义控制灯的控制器

package Protect_TrafficLight;

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

public class lampcontroller {

 //创建灯的控制器.
 private lamp currentlamp;//定义灯的当前状态.

 public lampcontroller() {
  
  currentlamp=lamp.S2N;
  currentlamp.light();
  //创建灯的定时器.控制等每隔10秒就把当前变绿的灯变黑.
  ScheduledExecutorService time = Executors.newScheduledThreadPool(1);
  time.scheduleWithFixedDelay(new Runnable(){

   @Override
   public void run() {
    currentlamp = currentlamp.black();
   }},
    
    10,
    10,
    TimeUnit.SECONDS);
 }
 
}

//创建主函数创建对象,调用对象

package Protect_TrafficLight;

public class mainClass {

 /**
  * @param args
  */
 public static void main(String[] args) {
 //创建路的对象.由于路由12条比较多.所以这里定义一个数组,比较好.
  String[] Roads = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
  for(int i=0;i<Roads.length;i++){
   new Road(Roads[i]);
  }
  new lampcontroller();
 }

}

---------------------- android培训、 java培训、期待与您交流! ----------------------

你可能感兴趣的:(String,tree,null,Class,交通,n2)