Per tutti voi esperti OOD. Quale sarebbe il modo consigliato per modellare il seguente scenario?
Ho una certa gerarchia di classi simile alla seguente:
class Base {
...
}
class Derived1 : Base {
...
}
class Derived2 : Base {
...
}
...
Successivamente, vorrei implementare diversi motori di compressione / decompressione per questa gerarchia. (Ho già il codice per diverse strategie che gestiscono i casi più diversi, come la compressione dei file, la compressione del flusso di rete, la compressione del sistema legacy, ecc.)
Vorrei che la strategia di compressione fosse inseribile e scelta al momento dell'esecuzione, tuttavia non sono sicuro di come gestire la gerarchia delle classi. Attualmente ho un design con accoppiamento stretto simile a questo:
interface ICompressor {
byte[] Compress(Base instance);
}
class Strategy1Compressor : ICompressor {
byte[] Compress(Base instance) {
// Common compression guts for Base class
...
//
if( instance is Derived1 ) {
// Compression guts for Derived1 class
}
if( instance is Derived2 ) {
// Compression guts for Derived2 class
}
// Additional compression logic to handle other class derivations
...
}
}
Così com'è, ogni volta che aggiungo una nuova classe derivata ereditata da Base, dovrei modificare tutte le strategie di compressione per tenere conto di questa nuova classe. Esiste un modello di progettazione che mi consente di disaccoppiarlo e mi consente di introdurre facilmente più classi nella gerarchia di base e / o in altre strategie di compressione?