Design Pattern: aggiunge nuove funzionalità a una classe astratta

0

Immagina di avere una classe astratta Node che ha diversi metodi e attributi. (Entra in una rete, invia un messaggio, trasmetti ...).

Voglio poter aggiungere / rimuovere funzionalità a / da quella classe Node (Funzionalità di routing, funzionalità di mining, ...)

Stavo pensando di utilizzare un pattern Decorator, dal momento che cambiamo il comportamento di quella classe dinamicamente in runtime.

return new RoutingNode(new BaseNode(name));

Ma ora, sto iniziando a pensare che questa non sia la scelta giusta poiché sto usando una classe base astratta su un'interfaccia.

Fondamentalmente voglio sapere se è possibile aggiungere funzionalità a un oggetto esistente senza sottoclasse della classe base. Ad esempio, desidero aggiungere la funzionalità di routing per consentire a un nodo di sapere che è in grado di instradare le richieste in arrivo o la funzionalità di data mining per consentire al nodo di eseguire attività di mining. Ma questo dovrebbe essere interoperabile nel senso che posso aggiungere o rimuovere funzionalità in fase di runtime.

Quale sarebbe il modo più elegante e migliore per gestire il mio caso di utilizzo.

    
posta Verhelst 20.01.2018 - 02:20
fonte

2 risposte

3

Non sono a conoscenza del tuo piano completo, ma sospetto che ciò che stai cercando di fare vìoli il SRP .

Una classe dovrebbe avere una sola responsabilità. È possibile aggiungere una singola funzionalità alla classe Node tramite l'ereditarietà, ma l'aggiunta di due tipi di funzionalità viola ora SRP.

Puoi lasciare il tuo Nodo come oggetto, che rappresenta un attore e usare, beh, Comandi per esempio, per eseguire azioni. Non posso proporre qualcosa di buono senza avere conoscenza del tuo dominio, ma penso che tu abbia avuto un'idea.

    
risposta data 20.01.2018 - 09:49
fonte
1

Diverse volte ho affrontato il problema di avere una sorta di grafico (albero in realtà) e avevo bisogno di fare alcune operazioni con quei nodi. Nel mio caso ho voluto dividere un mondo 3D in Quadtrees. Ma il rendering era qualcos'altro ... dovevo attraversare i nodi Quadtree e fare un rendering su di esso. Cioè divido i DATI e le OPERAZIONI che ti suggerisco di fare.

D'altra parte, c'erano momenti in cui volevo archiviare qualche tipo di metadati con i miei nodi a seconda delle OPERAZIONI che volevo fare (motivi di prestazioni). Quindi la soluzione era poter aggiungere una sorta di dati personalizzati ai nodi.

enum CustomDataType {SomeMiningData = 0, SomeRoutingData}
class ICustomData{
    virtual CustomDataType GetType() = 0;
}
class AdditionalDataContainer{
    void SetCustomData(ICustomData data);
    ICustomData GetCustomData(CustomDataType type);
}
class Node{
     AdditionalDataContainer additionalData;
}

Bene, i tipi e i setter per i dati personalizzati non sono importanti ma ottieni il punto.

    
risposta data 20.01.2018 - 10:21
fonte

Leggi altre domande sui tag