Come devo implementare le funzioni utilizzate per lo stesso scopo quando si utilizza il modello di progettazione della strategia?

1

Prima di tutto ti darò una breve spiegazione di cosa sto facendo dopo. Voglio scrivere un programma che applica i filtri a un'immagine usando un modello di progettazione strategica. Ho letto alcune documentazioni sul pattern e ho deciso di usarlo in questo modo.

Per prima cosa creerò un'interfaccia chiamata FilterStrategy che ha un metodo chiamato applyFilter.

Dopodiché creo 2 classi diverse, chiamiamole BeautifulFilter e UglyFilter che implementano l'interfaccia sopra.

Quindi scriverò una classe di contesto che ha un membro privato di FilterStrategy e un metodo setter per due diverse strategie. E infine un altro metodo in cui io chiamo applyFilter

In main my function ho creato FilterStrategy e ho impostato il filtro per UglyFilter e chiamato la funzione.

Ecco cosa sto chiedendo. BeautifulFilter e UglyFilter hanno molti metodi comuni come l'immagine di lettura, l'immagine di scrittura, la convoluzione e la visualizzazione ... e anche alcuni metodi utilizzati da uno solo dei filtri sopra. Dove dovrei implementare questi metodi? Devo duplicare il mio codice in entrambe le classi filtro?

    
posta Thunfische 25.10.2018 - 09:26
fonte

3 risposte

5

Implementerei una classe genitore per i tuoi filtri, ad esempio FilterBase

Questo FilterBase implementerebbe i metodi di lettura, scrittura, convoluzione e visualizzazione. Quindi, quando erediteranno le classi BeautifulFilter e UglyFilter, saranno in grado di accedere ai metodi stessi.

    
risposta data 25.10.2018 - 09:55
fonte
1

Here is what I am asking. BeautifulFilter and UglyFilter has many common methods such as read image, write image, convolution and display...

Finora questo suona bene.

and there also some methods that are used by only one of the filters above.

Ed ecco dove va all'inferno.

Where am I supposed to implement these methods? Should I duplicate my code in both of the filter classes?

Guarda che non puoi avere metodi speciali che possono essere chiamati solo se sono del tipo giusto e usano il modello di strategia. O modello di modello di modello o anche ereditarietà nuda. Il polimorfismo non funziona in questo modo. Non puoi chiedere al codice usando per sapere di che tipo si tratta.

Il mio esempio preferito per dire agli animali domestici di parlare. Mi piace non dover dire a un cane di abbaiare o un'anatra di ciarlare. Posso solo dire pet.speak () e qualunque animale domestico capisca cosa fare. Se a volte ho bisogno di silenzio, non avvolgo il comando speak in un if , io uso un gatto (altrimenti noto come il modello di oggetto nullo). Digli di parlare e ti ignora (perché è un gatto). Il mio gatto può essere attentamente progettato per accettare e ignorare tranquillamente ogni possibile messaggio (o ignorarne solo alcuni). Posso mandare il mio gatto a tutto ciò che funziona con gli animali domestici e le cose funzionano ancora bene senza far esplodere. Tuttavia, il mio pet rock è un altro problema. Dici al mio animaletto di parlare e fa un buco nel tessuto della realtà lamentandosi del fatto che non sa come parlare perché non l'ho mai insegnato come. Ora puoi stare attento e controllare le rocce prima di chiederle di parlare, ma è più facile usare i gatti. Sono davvero bravi a non fare nulla.

    
risposta data 26.10.2018 - 14:36
fonte
0

Da ciò che descrivi la classe di contesto dovrebbe essere interessato al caricamento / scrittura dell'immagine e il filtro dovrebbe riguardare solo i dati delle immagini che cambiano. Credo che il codice di manipolazione delle immagini sarà abbastanza complesso.

Quindi le classi di filtro avrebbero un metodo ApplyFilter () che prende i dati dell'immagine come parametro e restituisce i dati dell'immagine con il filtro applicato.

    
risposta data 25.10.2018 - 10:05
fonte

Leggi altre domande sui tag