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?