Servlet+AJAX實現的模擬電梯調度
需求產生:
大三下學期天天在學校的同一棟教學樓上課,每天要等四次電梯,有次等電梯無聊了,就想到電梯的運行邏輯該如何用程序來表達呢?
問題描述:
大學的那棟樓有21層,不過在頁面中畫21層有點密,所以只畫了9層;
同時有三座電梯等待調度;
按鈕分為樓層按鈕和電梯內按鈕,電梯內按鈕有樓層數字和關門按鈕;
運行的要求:
1.電梯空閑時,電梯內按鈕被點擊,對應按鈕被點亮,需要按關門鍵自動運行到最近的樓層;
2.電梯正在運行過程中,電梯內按鈕被點擊,如果離電梯更近,需要自動更改電梯目的停靠樓層為新添加的請求樓層,否則電梯還是到達原定樓層;
3.與電梯運行狀態相反的電梯內按鈕將不會被響應,比如從四樓向上運行的電梯,1、2、3樓按鈕無法點擊;
4.樓層按鈕請求因為三個電梯共享按鈕請求,所以應該設計一個合理的調度選擇;
①最優先選擇這樣的電梯:正在前往本樓層的電梯,如5樓向上的按鈕被點擊了,電梯B要從3樓到9樓,那麽優先選擇電梯B,且會先停靠5樓;
②其次選擇這樣的電梯:空閑狀態的電梯,如果沒有符合①中條件的電梯,那麽隨機選擇一個空閑狀態的電梯(這裏可以優化的,選擇最近的電梯)運行到當前樓層接人;
③如果沒有以上兩種條件的電梯存在,那麽保持請求狀態,直到以上兩種條件之一出現,如1樓的向上請求,但電梯ABC都在從2樓向上運行,那麽選擇最 先完成任務停止的電梯到1樓接人。
5.電梯到達某一層,電梯內亮著的按鈕被熄滅,樓層按鈕有兩種情況:
①當前電梯到達這一層樓之後沒有下一層樓的目標了,更改狀態為空閑,向上和向下的按鈕都熄滅(此條是因為4-②中如果向下請求,但電梯從下面運行上來時,熄滅的應該是向下的按鈕);
②當前電梯有繼續運行的下一層目標,只熄滅與當前運行方向相同的樓層按鈕。
界面:
包結構:
1.po層:
FutureFloor作為實體類,使用五個TreeSet保存按鈕請求數據(因為TreeSet 有序,唯一),這五個TreeSet分別保存,樓層上升請求、樓層下降請求、三個電梯內按鈕請求;
FutureFloorFactory,實體類的工廠類;
2.service層
Service:封裝一些方法;
3.servlet:
按順序分別為:
電梯停靠樓層時觸發的響應;
電梯開始運行時觸發的響應;
電梯內關閉按鈕被點擊時觸發的響應;
設置編碼的過濾器;
電梯內按鈕響應;
樓層按鈕響應;
向前端頁面返回電梯當前狀態;
缺陷:
其實保存電梯狀態只在前端保存,然後傳遞就可以了,後臺保存需要每次操作更改狀態,容易造成紕漏,且沒有頁面保存的實時性;
源碼:
https://files.cnblogs.com/files/liumaowu/elevator.zip
Servlet+AJAX實現的模擬電梯調度