JZOOD面向對象設計 - C2 管理類面向對象設計

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
    • 三步
      Parking lot find the spot to clear
      Update spot to be available
      Update available count for each level

      方案1:

      不滿足單一責任原則,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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。