L'obiettivo finale è disporre di un'interfaccia su cui ogni componente è d'accordo.
Quindi, se, per esempio, stavo costruendo un sito JavaScript che era stato fatto interamente in una implementazione MVC (non-Rails/PHP) vecchia e completamente in AJAX, mi sarei assicurato che ognuno di i componenti implementavano la stessa interfaccia per l'osservazione.
In ogni modello/vista/controller, potrei chiamare il mio metodo "subscribe" qualcosa di completamente diverso. Oppure, potrei implementare un'interfaccia standard per ciascuno.
modo che io possa avere una "(event_type, subscribing_class) .Register" metodo pubblico implementato in ogni singolo componente che ci si poteva aspettare di essere chiamato.
Analogamente, posso avere un "(event_type, dati) .Update" metodo pubblico implementato in ogni singolo componente che potrebbe essere previsto per essere chiamato.
Il .Register e .Update sono l'interfaccia per la mia comunicazione Observer. All'interno delle mie classi, ognuno potrebbe avere un metodo ".Subscribe (publisher, event_type, self_reference)". Questo metodo potrebbe essere proprio:
Class.Subscribe = function (publisher, event_type) {
var self_reference = this;
publisher.Register(event_type, self_reference);
};
Ogni potrebbe avere un metodo .Notify interna:
Class.Notify = function (type, data) {
var subscribers = this.subscribers[type],
i = 0, l = subscribers.length;
for (; i < l; i++) { subscribers[i].Update(type, data); }
};
Perché ho accettato che tutti i miei interfaccia di comunicazione sta andando a comportarsi in questo modo, non importa come sono i miei interni.
Il mio modello può continuare ad essere ignaro mio punto di vista, e la mia View può continuare ad essere ignaro mio controller.
Il .Notify e .Iscriviti non hanno bisogno di essere implementato in questo modo - non sono una parte dell'interfaccia accessibile al pubblico. Potrebbero essere tutto ciò che voglio.
.Iscriviti potrebbe prendere una serie di editori e spingerlo attraverso un ciclo for, per iscriversi a più punti di dati. Oppure prendi una serie di {"pub": x, "tipo": y} letterali oggetto, e chiama il metodo .Register di ciascuno, in modo che tu possa ottenere TUTTO il bootstrap di quella Classe con una chiamata di funzione.
Lo stesso vale per l'app di riproduzione audio. Non mi interessa quali proprietà pubbliche MusicPlayer condivide. So che usa .Play(), .Pause(), .Stop(), .Load (traccia).
Se mi assicuro di utilizzare SOLO i metodi di interfaccia pubblici concordati, il programma funzionerà. Perché?
perché il ragazzo che lavora su MusicPlayer potrebbe cambiare i meccanismi interni di MusicPlayer. Potrebbe riscriverli completamente. Forse c'è un ._ metodo precacheSong (traccia). Ma cosa succede se viene sostituito con. _cueTrack (traccia) lungo la strada?
stai usando solo widget di qualche amico, e un giorno di widget di crash, perché si erano estendendola o attuazione sulla base di metodi non-Interface o dati non interfaccia, che è accaduto a cambiare a partire dal v1.2.1
Quindi, anche in lingue lente, l'interfaccia è importante. Ti danno una mappa di come puoi aspettarti di chiamare QUALSIASI componente che ci si aspetta abbia quella funzionalità - e indipendentemente da come funzionano gli interni di quel componente, gli input e gli output saranno esattamente gli stessi (sebbene più tipo/errore- il controllo è necessario sugli input).
Ti permettono di "Duck-Type" molto facilmente (prendi una lista di diverse istanze di Classe - attiva la stessa chiamata di funzione su ciascuna, aspettandosi che ognuna abbia lo stesso metodo e abbia lo stesso formato di dati).
Ancora meglio con JavaScript:
Il mio codice .Iscriviti potrebbe anche essere scritta una sola volta, e quindi legato a tutto ciò che voglio "ereditare" esso.
Interface.Subscribe = function (publisher, evt_type) {
var self_ref = this;
publisher.Register(evt_type, self_ref);
};
Class_1.Subscribe = Interface.Subscribe.bind(Class_1);
Class_2.Subscribe = Interface.Subscribe.bind(Class_2);
Class_3.Subscribe = Some_Other_Interface.Subscribe.bind(Class_3);
E posso farlo liberamente, perché so che tutto quello che voglio iscrivermi alla sta per avere lo stesso pubblico-interfaccia.
Vedere il mio post modificato. Non riesco a capire perché sarebbe "ridondante" – NullUserException