Pattern per gestire diversi tipi di file

1

Nella mia applicazione prelevo i file dall'utente e lo elaboro.

Im per limitare a un certo ambito di tipi di file e ognuno di questi ha un approccio di elaborazione diverso.

Come posso progettare l'applicazione in modo che quando viene aggiunto un nuovo tipo di file, devo cambiare poche o nessuna riga nelle classi controller.

Dovrei usare un adattatore? Non sarebbe solo delegare le responsabilità di cambiamento ad un'altra classe?

Devo creare una classe rappresentativa per i file e gestirli in questo modo?

Se possibile, fornire un esempio di implementazione (generico). Potrebbe essere utile sapere che sto progettando un'applicazione Spring MVC e caricando file con file multipart. Inoltre, sto controllando il tipo di file tramite il nome dell'estensione nel controller del file di caricamento [questo potrebbe dover essere modificato].

    
posta Tiago Sirious 20.10.2016 - 12:30
fonte

1 risposta

2

I decoratori si adatterebbero, una implementazione per ciascuno dei tipi, uno in più come facciata (o dispatcher? Non sono sicuro del termine qui) per il routing alla corretta implementazione.

La facciata e il decoratore multiplo dovrebbero implementare la stessa interfaccia, ecco un esempio:

public interface FileProces{
    public void process(File file);
    public boolean canProcess(File file);
}

Ogni decoratore dovrebbe gestire il proprio tipo di file:

public class JpgFileProces implements FileProces{
    public void process(File file){
        if(!canProcess(file)){
            throw new IllegalArgumentException();
        }
        ...
    }

    public boolean canProcess(File f){
        return f.getContentType.equals("image/jpeg");
    }
}

Quindi la facciata:

public FacadeFileProces{
    public Set<FileProcess> setProcess;
    public void process(File file){
         for(FileProcess process : setProcess){ 
               if(process.canProcess(file)){
                     process.process(file);
                     break;// you can either do that of for more security, either ensure that you have only one processor and not multiple that are registered.
               }
         }
    }

    public boolean canProcess(File file){
       for(FileProcess process : setProcess){
           if(process.canProcess(file)){
               return true;
           }
       }
       return false;
    }
}

Nota: DavidPacker nel suo commento parlava di fabbrica: la sua soluzione è più utile se il tuo FileProcessor non è stateless. Se non lo sono, usare una fabbrica che restituisce solo singleton è lo stesso che ho fatto, sto solo mascherando il fatto che ho dei sottolivelli.

    
risposta data 20.10.2016 - 13:34
fonte