生活随笔
收集整理的這篇文章主要介紹了
黑马程序员:交通灯管理系统学习
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
------- android培訓、java培訓、期待與您交流! ----------
一、項目分析
提示:畫圖非常有助于理解和分析項目的問題,所以一定要先畫圖理清楚思路。
1,通過畫圖可以看出一共存在12條路線,其中右轉(zhuǎn)彎可以隨時轉(zhuǎn),可以假設(shè)為
控制右轉(zhuǎn)彎的燈一直是綠燈。剩下的八條路線是兩兩相對,所以只要考慮
圖中標出的①②③④這四條路線的切換順序即可
2,要用面向?qū)ο蟮乃枷敕治鲰椖恐行枰男ο蟆?/span>
①因為要獲得每條路線上車輛的數(shù)據(jù),所以要把路線看成擁有這些數(shù)據(jù)的 對象,所以要有一個描述路線的類,起名:Road
②車輛是走還是停要由燈的顏色來控制,所以顏色是燈的屬性,燈要提供獲取和改變顏色的方法,所以燈也是對象,起名:lamp
③燈的顏色是定時改變的所以要有燈的控制系統(tǒng),來調(diào)用燈提供的方法定時改變燈的顏色。這些燈的控制系統(tǒng)屬于一個系統(tǒng)
?所以用單例設(shè)計模式。起名:LampController
二、對象具體功能的分析:
1,Road類
用英文字母的首字母代表四個方向:東(East)南(South)西(West)北(North)?
12條路線分別是:S2N,S2E,S2W,E2W,E2S,E2N,N2S,N2W,N2E,W2E,W2S,W2N
成員變量:
每個Road對象都有一個name變量表示方向,路線上的車輛可以用路線的名字表示,有一個vehicles變量表示車輛集合,
構(gòu)造方法:
每個對象中要有一個線程每隔一個隨機的時間向路線上增加一輛車。還有有一個定時器每隔一秒檢查燈是綠燈還是紅燈如果是綠燈就把車輛集合中的第一輛車刪除代表有一輛車通過了馬路。
2,Lamp類
成員變量:
12條路線上每條路上都有一個燈,所以燈的名字用路線名稱命名,而且要通過燈的名字就可以獲得該燈的對象,所以用枚舉。燈的狀態(tài)用(boolean lighted)表示
,true 表示綠燈,false表示紅燈 。通過畫圖分析選出了4條路線,S2N、S2W、E2W、E2N,這四條路線的燈依次變綠,他們對應(yīng)的相反方向的燈(opposite)隨著他們的變化而變化。因為要輪流切換所以要知道下一個燈的名字,用(next)表示。
成員方法
:讓燈變色的方法light()和blankOut(),S2N、S2W、E2W、E2N這四個路線上還需要添加讓反方向和下一個燈隨之變換的方法。
3,LampController類
增加控制當前燈變綠后,每隔10秒將當前燈變紅,并將下一個燈變綠。
4,Main類
循環(huán)創(chuàng)建12條路線的對象,并讓燈的控制系統(tǒng)啟動。
Road類的代碼:
[java]?view plaincopy ?? package?JiaoTongDeng;?? ?? 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?{?? ????private?List<String>?vechicles?=?new?ArrayList<String>();?? ?????? ????private?String?name?=?null;?? ????public?Road(String?name){?? ????????this.name?=?name;?? ?????????? ????????ExecutorService?pool?=?Executors.newSingleThreadExecutor();?? ?????????? ????????pool.execute(new?Runnable(){?? ?????????????? ????????????public?void?run(){?? ????????????????for(int?i=1;?i<1000;?i++){?? ????????????????????try?{?? ?????????????????????????? ????????????????????????Thread.sleep((new?Random().nextInt(10)+1)*1000);?? ????????????????????}?catch?(InterruptedException?e)?{?? ????????????????????????e.printStackTrace();?? ????????????????????}?? ????????????????????vechicles.add(Road.this.name?+?"方向,第"?+i+"輛車");?? ????????????????}?? ????????????}?? ????????});?? ?????????? ????????ScheduledExecutorService?timer?=?Executors.newScheduledThreadPool(1);?? ?????????? ????????timer.scheduleAtFixedRate(?? ????????????????new?Runnable(){?? ????????????????????public?void?run(){?? ????????????????????????if(vechicles.size()>0){?? ?????????????????????????????? ????????????????????????????boolean?lighted?=?Lamp.valueOf(Road.this.name).isLighted();?? ????????????????????????????if(lighted){?? ?????????????????????????????????? ????????????????????????????????System.out.println(vechicles.remove(0)+"開走了!");?? ????????????????????????????}?? ????????????????????????}????? ????????????????????}?? ????????????????},1,1,TimeUnit.SECONDS);?? ????}?? ?? }??
Lamp類的代碼:
[java]?view plaincopy package?JiaoTongDeng;?? ?? public?enum?Lamp?{?? ????S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",true),E2S("W2N","S2N",true),?? ????N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),?? ????S2E(null,null,false),E2N(null,null,false),N2W(null,null,false),W2S(null,null,false);?? ?? ????private?Lamp(){?? ????}?? ?????? ????private?Lamp(String?opposite,String?next,boolean?lighted){?? ????????this.opposite?=?opposite;?? ????????this.next?=?next;?? ????????this.lighted?=?lighted;?? ????}?? ?????? ????private?String?next;?? ????private?String?opposite;?? ????private?boolean?lighted;?? ?????? ????public?boolean?isLighted(){?? ????????return?lighted;?? ????}?? ?????? ????public?void?light(){?? ????????this.lighted?=?true;?? ????????if(opposite?!=?null){?? ????????????Lamp.valueOf(opposite).light();?? ????????}????? ?? ????????System.out.println(name()?+?"方向,變成綠燈了,應(yīng)該有6個方向上有車輛行駛");?? ????}?? ?????? ????public?Lamp?blackOut(){?? ????????this.lighted?=?false;?? ????????if(opposite?!=?null){?? ????????????Lamp.valueOf(opposite).blackOut();?? ????????}?? ?????????? ????????Lamp?nextLamp?=?null;?? ????????if(next?!=?null){?? ????????????nextLamp?=?Lamp.valueOf(next);?? ????????????System.out.println(name()+"方向,禁止通行"+next+"和"+opposite+"方向變成綠燈了");?? ????????????nextLamp.light();????????????? ????????}????????? ????????return?nextLamp;?? ????}?? }??
LampController類代碼
[java]?view plaincopy package?JiaoTongDeng;?? ?? 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();?? ?????????? ????????ScheduledExecutorService?timer?=?Executors.newScheduledThreadPool(1);?? ????????timer.scheduleAtFixedRate(?? ????????????????new?Runnable(){?? ????????????????????public?void?run(){?? ?????????????????????????? ????????????????????????currentLamp?=?currentLamp.blackOut();?? ????????????????????}?? ?????????????? ????????},?10,?10,?TimeUnit.SECONDS);?? ????}?? ?? }??
Main類代碼
[java]?view plaincopy package?JiaoTongDeng;?? ?? public?class?Main?{?? <span?style="white-space:pre">??</span>?? ????public?static?void?main(String[]?args)?{?? ????????String[]?directions?=??? ????????????????new?String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};?? ?????????? ????????for(int?i=0;?i<directions.length;?i++){?? ????????????new?Road(directions[i]);?? ????????}?? ?????????? ????????new?LampController();?? ????}?? ?? } ?
------- android培訓、java培訓、期待與您交流! ----------
總結(jié)
以上是生活随笔為你收集整理的黑马程序员:交通灯管理系统学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。