Sto lavorando a un progetto in cui devo monitorare lo stato di un ascensore. Finora, il mio design ha questo aspetto: 
Stiamoutilizzandounalibreriaditerzepartiperleggereemonitorareivaloriintemporealedallogiccontrollerdell'elevatore.Untagèunvaloreinteroinunregistrodimemoriadellogiccontroller.Adesempio,DM140contieneladirezionedell'elevatore.
Usounlivelloadattatoripermantenereisolatoildominiodell'applicazionedallalibreriaditerzeparti.
Neldominio,ElevatorDirectionMonitorprendeilvaloreinteroElevatorTag,estrapolaladirezionecorrentedell'elevatoreepoinotificaaisuoiclienticheladirezionedell'elevatoreècambiata.Finqui,tuttobene.
Eccoilmioproblema:cisarannounsacco(uncentinaioopiù)ditipidiinformazionidamonitoraredall'ascensore,comeilpavimentocorrente,seleportesonoaperte/chiuse,ecc.Secontinuocosì,Dovròcreareunaclassedimonitorperognitipodiinformazionechevogliomonitorare(adesempio,ElevatorFrontDoorStatusMonitor,ElevatorRearDoorStatusMonitor)eognimonitorassociatoallapropriainterfacciaObserver.Questosignificamoltolavoro.Hocercatoditrovareunaltromodoperstrutturarelamiaapplicazione,manonhotrovatonulladipiù"elegante".
La logica di base in ogni classe di monitor sarebbe praticamente la stessa su tutta la linea: ascoltare la modifica del valore su un'istanza ElevatorTag , estrapolare le informazioni dal nuovo valore del tag e quindi notificare gli osservatori. Il problema sembra derivare dal fatto che ogni classe di osservatori deve avere una firma di interfaccia diversa (ad esempio ElevatorDirectionObserver ha NotifyDirectionChanged(ElevatorDirection newDirection) quando DoorStatusMonitor avrebbe piuttosto qualcosa di simile a NotifyDoorStatusChanged(DoorPosition frontOrRear, DoorStatus openOrClosed) ).
Pensi che la soluzione su cui sto lavorando sia accettabile. In caso contrario, qualcuno potrebbe suggerire quali schemi dovrei usare o investigare, o qualcosa che potrebbe aiutarmi a semplificare il mio design?