Aquí hay un comienzo rápido para hacer girar los engranajes ...
ParkingLot es una clase.
ParkingSpace es una clase.
ParkingSpace tiene una entrada.
La entrada tiene una ubicación o, más específicamente, la distancia desde la entrada.
ParkingLotSign es una clase.
ParkingLot tiene un ParkingLotSign.
ParkingLot tiene un número finito de ParkingSpaces.
HandicappedParkingSpace es una subclase de ParkingSpace.
RegularParkingSpace es una subclase de ParkingSpace.
CompactParkingSpace es una subclase de ParkingSpace.
ParkingLot mantiene una variedad de ParkingSpaces y una serie separada de ParkingSpaces vacantes en orden de distancia desde su Entrada.
Se puede indicar a ParkingLotSign que muestre "lleno", "vacío" o "en blanco / normal / parcialmente ocupado" llamando a .Full (), .Empty () o .Normal ()
Parker es una clase.
Parker puede aparcar ().
Parker puede desaparcar ().
Valet es una subclase de Parker que puede llamar a ParkingLot.FindVacantSpaceNearestEntrance (), que devuelve un ParkingSpace.
Parker tiene un ParkingSpace.
Parker puede llamar a ParkingSpace.Take () y ParkingSpace.Vacate ().
Parker llama Entrance.Entering () y Entrance.Exiting () y ParkingSpace notifica a ParkingLot cuando está ocupado o desocupado para que ParkingLot pueda determinar si está lleno o no. Si está lleno o vacío recientemente o no está lleno o vacío, debe cambiar ParkingLotSign.Full () o ParkingLotSign.Empty () o ParkingLotSign.Normal ().
HandicappedParker podría ser una subclase de Parker y CompactParker una subclase de Parker y RegularParker una subclase de Parker. (podría ser exagerado, en realidad).
En esta solución, es posible que se cambie el nombre de Parker a Automóvil.