come si chiama questo modello?

0

Lo vedo molto nei framework.

Hai una master class con cui le altre classi si registrano.

La classe master decide quindi a quale delle classi registrate delegare la richiesta. Un esempio basato su una classe può essere qualcosa di questo.

public interface Processor {
  public boolean canHandle(Object objectToHandle);
  public void handle(Object objectToHandle);
}

public class EvenNumberProcessor extends Processor {
  public boolean canHandle(Object objectToHandle) {
     if (!isNumeric(objectToHandle)){
      return false
     }
     return isEven(objectToHandle);
   }

   public void handle(objectToHandle) {
     //Optionally call canHandleAgain to ensure the calling class is fufilling its contract
     doSomething();
   }
 }

public class OddNumberProcessor extends Processor {
  public boolean canHandle(Object objectToHandle) {
     if (!isNumeric(objectToHandle)){
      return false
     }

    return isOdd(objectToHandle);
  }

   public void handle(objectToHandle) {
     //Optionally call canHandleAgain to ensure the calling class is fufilling its contract
     doSomething();
   }
 }

//Can optionally implement processor interface
public class processorDelegator {

  private List processors;
  public void addProcessor(Processor processor) {
    processors.add(processor);
  }

  public void process(Object objectToProcess) {
     //Lookup relevant processor either by keeping a list of what they can process
     //Or query each one to see if it can process the object.

     chosenProcessor=chooseProcessor(objectToProcess);
     chosenProcessor.handle(objectToProcess); 
  }

}

Nota ci sono alcune varianti che vedo su questo. In una variante le sottoclassi forniscono un elenco di cose che possono elaborare e che ProcessorDelegator comprende. L'altra variante che è elencata sopra in codice falso è dove ognuno viene interrogato a sua volta.

Questo è simile alla catena di comando, ma non penso che la stessa catena di comando significhi che il processore deve passare ad altri processori.

L'altra variante è dove il ProcessorDelegator stesso implementa l'interfaccia, il che significa che puoi ottenere alberi di ProcessorDelegator che si specializzano ulteriormente. Nell'esempio precedente potresti avere un delegatore del processore numerico che delega a un processore pari / dispari e un processordelegator stringa che delega a stringhe diverse.

La mia domanda è: questo modello ha un nome?

    
posta Wes 05.09.2012 - 01:05
fonte

5 risposte

8

Per me sembra il modello di strategia, solo che la selezione dell'algoritmo specifico non è codificata.

    
risposta data 05.09.2012 - 01:43
fonte
5

Lo schema generale del codice presentato qui è Strategia perché consente all'algoritmo sottostante di variare in modo indipendente dai client che lo utilizzano. Una catena di responsabilità nel metodo chooseProcessor () determina quale algoritmo sottostante viene utilizzato dando a più di un cliente la possibilità di gestire una richiesta.

Se il tuo esempio si concentra sull'implementazione del metodo chooseProcessor (), potrei vedere che Chain of Responsibility è il modello dominante, ma dal momento che vengono forniti solo due commenti e nessuna implementazione, il tuo esempio si concentra chiaramente sul metodo Strategy.

    
risposta data 05.09.2012 - 15:24
fonte
3

Non sono d'accordo con tutti gli altri qui e vado con un'implementazione scalabile del modello di osservatore. La parola 'handle' gli dà via: qualcosa si verifica o deve accadere e un elenco di gestori riceve un pezzo di dati in base all'occorrenza, e spesso le volte in cui l'osservatore è il primo atto consiste nel testare i dati per vedere se tu può gestirlo, e se non lo ignori. La dettatura a ritroso che puoi gestire non è diversa da javascript quando chiami e.Cancel (); o qualche altro simile per fermare il resto della catena di eventi.

    
risposta data 05.09.2012 - 03:55
fonte
2

Probabilmente si adatta meglio alla catena di responsabilità, ma sembra abbastanza specifico da essere considerato diverso. Non penso che ci sia un nome per questo specifico modello.

    
risposta data 05.09.2012 - 02:24
fonte
1

Che cosa ti fa pensare che sia un qualsiasi tipo di modello? Forse è solo (Dio) un po 'di codice. Quindi, io vado con "Nessuno".

Voglio dire, fondamentalmente, ciò che rende un pattern un pattern è che lo etichetti in quel modo e poi gli altri sviluppatori hanno bisogno di molta meno documentazione aggiuntiva per capire come funziona. Ma dal momento che non gli hai dato alcun nome, e non sono affatto sicuro di come funzioni o qual è il problema, anche dopo aver letto l'implementazione completa (ad esempio, il metodo chooseProcessor, una componente vitale, sembra mancante). Quindi mi sembra che, in tutti i modi che contano, non è un modello.

Voglio dire, se solo potessi semplicemente avere un qualche tipo di tipo di sistema per distinguere quali elementi possono accettare ciascun processore e quindi potresti registrare quei Processori con uh, uh, uh, un compilatore e quindi implementerà tutta la logica per te. Un uomo può sognare.

    
risposta data 05.09.2012 - 20:11
fonte

Leggi altre domande sui tag