Elevator System Follow-up
管理類OOD題型
設計一個模擬/代替管理員日常工作的系統
管理類OOD解題思路
- 對于core object 考慮進出的對象是什么
比如Elevator System Input: Request Output: Elevator - 對于use case 從管理員的角度考慮
包含reserve,serve,checkout
解析:通常我們在考慮管理類的OOD設計題目,從Reserve(還沒有進入設計主體之前,我們會遇見的use case),Serve(在進入主體的時候,當我們使用的情況下,我們會遇見什么use case),Check out(當我們離開主體的時候會有哪些use case) - Class
使用收據的形式,來保管信息,比如圖書館,包括User,Receipt,Book,有收據顯示User借了什么Book
Parking Lot
Clarify
- what
parking lot 管理什么,可以用線性和進出的思考方式
Vehicle -> ParkingLot -> Parking Spot
然后針對上面的主體確認清楚
針對本題:
Parking lot: 考慮多層的Parking lot, 沒有錯層
Vehicle: 考慮三種大小的車
不考慮殘疾人停車位/充電車位
如何設計停車場來支持停不同大小的車?當尋找合適的車位的時候, 需要看邊上的位置是否是空位;或者設計專有車位當有新的車形需要支持的時候,需要大量修改,利用率更低 - how
規則1:如何停車
針對本題:停車場能夠顯示空閑位置的個數
規則2:收費
針對本題:根據時間收費
Core Object
-
常見不好設計類型
1.沒有需要知道cars具體信息的usercase,多余
2.依賴于具體,多余的依賴
3.動態和靜態元素,靜態元素不要存放動態元素,使用receipt解決
Cases
兩種思考方法:
根據列出的類思考,把自己想象成開車的人
根據系統管理員來思考,把自己想象成停車場,大部分這樣思考
- ParkingLot 思考
Get available count
Park vehicle
Clear spot
Calculate price - 管理類常見User Case
Reservation : X
Serve: Park vehicle,Get available count
Check out: Clear spot,Calculate price
Class
- Use case: Park vehicle
- 三步
Parking lot checks the size of vehicle
Parking lot find an available spot for this vehicle
Vehicle takes the spot(s)
- 三步
要點:
使用vehicle接口滿足依賴反轉原則,使用level抽象類實現開閉原則,使用findSpotsForVehicle滿足開閉原則,雖然是私有,能clarify公有parkVehicle的具體過程
解析:抽象類Vehicle需要把private變量變成protected,protected 需要從以下兩個點來分析說明:子類與基類在同一包中:被聲明為 protected 的變量、方法和構造器能被同一個包中的任何其他類訪問;子類與基類不在同一包中:那么在子類中,子類實例可以訪問其從基類繼承而來的 protected 方法,而不能訪問基類實例的protected方法。protected 可以修飾數據成員,構造方法,方法成員,不能修飾類
- Use case: Clear spot
-
三步
方案1:
Parking lot find the spot to clear
Update spot to be available
Update available count for each level
不滿足單一責任原則,Vehicle負責了不屬于它的責任
方案2:使用receipt
-
-
Use case:Calculate price
When clear spot, parking lot calculates the expected price to pay
Correctness
- 要點
Validate use cases
Follow good practice:比如訪問權限,exception
SOLID
Design pattern:
Clean and elegant
Keep code extendable
Safe
Show off your skills ! -
Exceptions
-
問題:每層的spots怎么排列
像添加Level一樣,添加一個Row作為新的Class
Design Pattern
Clean and elegant
Keep code extendable
Safe
Show off your skills !
Singleton
-
方法1:基本式
解析:被static修飾的類的變量或者方法它是屬于類的,而并不屬于某一個具體的實例。static方法一般稱作靜態方法,對于靜態方法來說,是沒有this的,因為它不依附于任何對象。
-
方法2:線程安全式
加了鎖性能會慢
解析:被synchronized修飾之后,方法同時只能被一個線程訪問。靜態內部類:外部類加載時并不需要立即加載內部類,內部類不被加載則不去初始化INSTANCE,故而不占內存。即當ParkingLot第一次被加載時,并不需要去加載LazyParkingLot,只有當getInstance()方法第一次被調用時,才會去初始化INSTANCE,第一次調用getInstance()方法會導致虛擬機加載LazyParkingLot類,這種方法不僅能確保線程安全,也能保證單例的唯一性,同時也延遲了單例的實例化。 -
方法3