Algoritmo e classi del sistema di elevatori di progettazione? [chiuso]

3

Ecco le classi principali che riesco a pensare in cima alla mia testa. Tutti gli oggetti business seguiranno l'astrazione (implementare le interfacce). Non ho menzionato i nomi delle interfacce per evitare la verbosità. Mi sono concentrato principalmente sulla programmazione di alto livello algo e sulle classi di alto livello senza entrare troppo nei dettagli

I principi che ho seguito principalmente qui sono: -

  1. Principio della singola responsabilità (ogni classe è preoccupata per la propria preoccupazione)
  2. Apri per estensione chiusa per modifica (vedi strategie)
  3. Tell non chiedere (Clubbed il comportamento con lo stato nel comportamento di classe dell'ascensore funziona nel suo stato) Astrazione / polimorfico

Oggetti dominio: -

Elevator -    Ecco lo stato

  1. floorButton (conterrà l'elenco dei pulsanti del pavimento nell'ascensore)

  2. elevatorRequest conterrà le richieste dell'elevatore in ordine crescente se la direzione è SU altrimenti sarà contenuta in ordine decrescente se la direzione è GIÙ.

  3. currentDirection (UP o DOWN)
  4. currentFloor
  5. currentState (Running / Idle / Maintenance etc)

    Ecco il comportamento

  6. run (...): - Elaborerà la richiesta di ascensore finché non sarà vuota. se l'elenco non è vuoto, imposterà il suo stato su In esecuzione, imposta la direttiva in base al confronto di currentFloor e qualsiasi richiesta in elevatorRequest e stampa in esecuzione. Tt controllerà anche ogni richiesta di ascensore nella lista elevatoreRichiesta in ordine sequenziale e controlla se è uguale a getcurrentFloor (). Se sì stampa "Reached Floor" + currentFloor. Altrimenti rendi lo stato come Interrotto
  7. setCurrentFloor (): - Ogniqualvolta l'elevatore raggiunge qualsiasi piano, chiamerà questo metodo per impostare il currentFloor.
  8. OpenDoor ()
  9. closeDoor ()
  10. reset ()

Pulsante -

  1. Pulsante Piano (pulsante all'interno dell'elevatore per inserire la richiesta ascensore)
  2. Pulsante di direzione (pulsante fuori dall'ascensore per chiamare l'ascensore)

ElevatorRequest

  1. floorNumber
  2. direzione
  3. tempo

Oggetti controller / business: -

ElevatorController -   Per gestire la richiesta http e delegarla a ElevatorRequestManager

  1. processElevatorRequest (..)
  2. processFloorRequest (..)

ElevatorScheduleManager -   Per effettuare la richiesta possiamo usare diversi tipi di strategie come timebased, direction based ecc. Qui lo farò   usa la strategia di direzione. Ecco la DirectionBasedStrategy

  1. processRequest (...) Modello - seguirà il modello di fabbrica per creare quello dell'oggetto figlio della strategia basato sul parametro (può essere configurato nel file delle proprietà)

DirectionBasedStrategy -

  1. Verificherà lo stato attuale dell'ascensore,
  2. Se Elev è in stato di inattività, posizionerà il pavimentoRequest nell'elenco denominato ElevatorRequest. Altrimenti chiamare ElevatorRequestManager per inserire la richiesta in set (Tree based) PendingRequests
  3. Se Elev è in stato di esecuzione, otterrà la direttiva corrente. Se corrisponde alla direzione di ElevatorRequest e il pavimento attuale è inferiore a ElevatorRequest floor posizionerà la richiesta in floorRequest list. Altrimenti chiamare ElevatorRequestManager per inserire la richiesta in set PendingRequests Ho scelto TreeSet in modo che la richiesta possa essere archiviata in ordine di tempo e non contenga voci duplicate
  4. processRequest (...)

ElevatorRequestManager -   Questo posizionerà il ElevatorRequest in una lista di dati come la lista. Qui vediamo due classi DownwardElevatorRequestManager e UpwardElevatorRequestManager

  1. processRequest (...)
  2. processPendingRequest (...) Questo metodo avvierà il thread che continuerà a essere in esecuzione. Questo utilizzerà nuovamente DirectionBasedStrategy. Questo eseguirà il polling delle richieste in sospeso per selezionare le richieste nella stessa direzione fino all'ultima richiesta in quella direzione. Una volta che tutte le richieste sono state selezionate, rimuoverà le richieste da PendingRequests e metterle in elevatorRequest e chiamare il metodo run su elevator. Per scegliere la direzione dello spostamento, sceglierà la direzione dalla prima richiesta in PendingRequests (contiene già la richiesta in ordine cronologico)

Aggiornamento: - La mia domanda è di rivedere questo progetto / principi ad alto livello

    
posta M Sach 18.11.2016 - 04:25
fonte

0 risposte