Aggiungi comportamento senza modificare la classe esistente

1

Ho una classe Container , che rappresenta il wrapper attorno a std::list . Questa classe contiene i seguenti metodi pubblici:

  • void add(Shape *item)
  • void next()
  • void setBegin()
  • Shape* curr()

e variabili protette

  • std::list <Shape*> _container
  • std::list <Shape*>::iterator _iter

Ora ho bisogno di aggiungere l'ordinamento del contenitore senza modificare il codice di classe esistente.

Quale modello dovrei usare? Penso che Decorator sia il modello più appropriato in questo caso. Devo ridisegnare il contenitore di classe?

    
posta Igor Chemidov 27.11.2013 - 12:16
fonte

3 risposte

1

Il container così com'è è sia un elenco che un iteratore, quindi suggerirei di suddividerlo in due classi, una per ciascuna delle responsabilità. È quindi possibile eseguire un'implementazione alternativa del contenitore dell'elenco che è ordinabile.

per es.

class UnorderedContainer : Container
{
}

class SortableContainer : Container
{
    void Sort();
}

abstract class Container
{
    void Add(Shape *item);
    Iterator GetIterator();
}

class Iterator
{   
    Shape* Current();
    void Next();
}

Vorrei anche considerare attentamente se l'elenco è mutabile mentre stai usando next () per iterarlo attraverso di esso. Non è affatto ovvio cosa succederebbe quando chiami next () dopo un sort () - può rivisitare gli elementi che hai già fatto un passo? Se rompi l'iteratore nella sua classe, potresti farlo agire su una copia immutabile della lista presa nel punto in cui hai iniziato l'iterazione.

    
risposta data 27.11.2013 - 17:26
fonte
0

Sì, Decoratore è esattamente quello che stai cercando. In realtà, la classe Container è già un decoratore per std :: list.

    
risposta data 27.11.2013 - 12:23
fonte
0

È possibile creare una classe secondaria di classe Container, ad esempio SortedContainer e aggiungere funzionalità ordinate nella classe derivata. Soddisfa entrambi i principi, menzionati di seguito.

  • Apri il principio di chiusura
  • Principio di sostituzioni di Liskov
risposta data 27.11.2013 - 17:36
fonte

Leggi altre domande sui tag