In base alla risposta "Ero preoccupato per l'accoppiamento stretto tra il mio lettore e il chiamante."
The Facade Pattern non ha alcun programma nascosto. È un modello molto diretto. Rendi le tue classi di applicazione più facili da usare per il codice "utente".
Il modello di facciata non ha lo scopo di ridurre l'accoppiamento da singole classi. L'accoppiamento ridotto del codice "Facaded" è generalmente un sottoprodotto di ciò.
Per fare un esempio concreto, supponiamo che volessi comandare al mio sistema di iniziare a raccogliere dati e riportare gli eventi man mano che si verificano. Per accendere il sistema potrebbe essere necessario registrare l'interfaccia di controllo per ricevere eventi specifici, accendere un sensore o due, leggere i dati GPS, leggere le informazioni meteorologiche, posizionare i sensori, fornire letture ai moduli di elaborazione dell'algoritmo, ecc. .qualcuno di essi avrà almeno una classe che lo rappresenta. Mentre lo sviluppatore di applicazioni può sapere come mettere insieme tutti questi pezzi, lo sviluppatore povero che sviluppa l'interfaccia utente avrà le mani piene per capire tutto.
IOW, questo è molto per il codice "utente" per sapere quando tutto ciò che vogliono veramente è dire StartDataCollection (). Così nasce la facciata. Tutta quella conoscenza del coordinamento delle classi per coordinare l'elaborazione è nascosta dietro quella facciata.
Se tutto il tuo sistema avrà sempre una implementazione di codice "utente" o lo stesso sviluppatore sta implementando l'interfaccia dell'applicazione e "utente", allora Facade non è probabilmente necessario e forse una sorta di Command Pattern o concetto operativo è un opzione.
Dove la Faccia brilla è quando il tuo sistema ha più tipi di interfaccia "utente" che possono controllarlo. Usando la facciata, con l'aggiunta di eventi, elaborazione asincrona, code di messaggi, forse alcune regole specifiche dell'applicazione, ecc ... e assicurando che Facade e il codice dell'applicazione siano indipendenti dall'interfaccia utente, il compito di implementare solo nuovi tipi di interfacce finisce per diventare uno dei dati di scrittura / lettura da / per l'interfaccia fisica. Fare in modo che l'app faccia le cose giuste è banale perché basta fare chiamate sulla facciata e ricevere eventi dalla facciata.
Inoltre, puoi sviluppare e testare l'interfaccia "utente" totalmente indipendente dalla tua applicazione. Anche se questo è buono di per sé, è un proiettile d'argento per rispettare le scadenze perché ora puoi lanciare più persone al problema (che non funziona quasi mai nello sviluppo del software) poiché possono sviluppare il loro software indipendentemente dagli altri e dalle interfacce utente / controllo tendono a non essere così difficili come l'elaborazione dell'applicazione principale.
Tornando alla tua domanda .... Il giocatore dovrebbe essere esposto o no? Direi che se tutti i metodi di facciata sono semplicemente rigurgitare il metodo corrispondente sulla classe, allora penso che sia necessario rivisitare i casi d'uso o la progettazione. So che hai appena dato un esempio semplice, ma in pratica quello che hai mostrato è che "Player" è davvero la facciata. L'altra opzione è che forse la funzionalità di Player.Play () appartiene alla facciata anziché a Player.
Penso che sia giusto esporre un gruppo limitato di classi in Facade per semplicità, in particolare per quanto riguarda le informazioni di reporting. Tuttavia, eviterei di esporre le classi con l'intento di avviare operazioni applicative. Creare un metodo di facciata per questo. Cosa succede se cambi la tua applicazione per consentire più utenti ma solo 1 può giocare alla volta? Se il codice "utente" ha accesso all'istanza Player, ti verrà un po 'di dolore. Se hanno solo accesso al metodo Play di facciata (), modifica il numero di utenti fino a quando il tuo cuore è soddisfatto.