La delega condizionale oi diversi tipi di membri interrompono il modello Composito?

3

Ecco come comprendo il pattern composito:

Nel pattern composito, un oggetto radice è composto da oggetti che possono essere ulteriormente composti. Inoltre, per essere considerati compositi, tutti questi oggetti espongono un'interfaccia comune.

La mia domanda appare due volte in corsivo sotto. Un esempio dato da un mio mentore è un filesystem rappresentato da oggetti:

interface Node {
  public int size();
}

class Folder implements Node {
  List<Node> contents;

  public int size() {
    int size = 0;
    for (Node n : contents)
      size += n.size();

    return size;
  }
}

class File implements Node {
  int size;

  public int size() {
    return size;
  }
}

Questo sembra abbastanza pulito. Ha una bella proprietà di cui mi sto chiedendo:

  • Una chiamata size() su Folder chiama size() su tutti membro Nodes s, non c'è nessuna condizione che protegge size() chiama membro Node s. Se esistesse una condizione che proteggeva size() chiamate sui bambini Node s, la struttura non sarebbe più il modello Composito?

Per chiarire, darò un altro esempio. Supponiamo che un oggetto Person possa grab() e Person sia composto da 2% diHand se 1% diMouth. Sia Hand che Mouth possono grab() . In un'istanza di Person , la chiamata di person.grab() chiamerà grab() su uno dei membri in grado di grab() . Ad esempio, la sinistra Hand sarà grab() se la destra Hand è già piena, e entrambi Hand prenderà se l'oggetto è pesante.

È un pattern composito, anche se ci sono guardie condizionali sulle chiamate dei membri?

    
posta kdbanman 13.03.2015 - 18:44
fonte

1 risposta

5

Il pattern composito è una buona scelta per strutture ad albero (ricorsive), dove i client vogliono utilizzare le operazioni dall'interfaccia senza sapere realmente se qualcosa è un composito o una foglia. In altre parole, si aspettano che le classi derivate confermino il principio di sostituzione di Liskov. Ciò che non importa è il modo in cui le operazioni sono implementate internamente.

Quindi il tuo esempio di Person non è una cattiva scelta per il pattern composito perché la sua implementazione grab interna contiene un condizionale. È una scelta sbagliata perché Person non è un oggetto ad albero ricorsivo . Può essere composto da mani e bocca, ma non da altri oggetti Person , e non vedo un buon termine che possa essere definito come una classe base comune per Person e Hand , o un caso d'uso in cui un cliente può ignorare il fatto che sta chiedendo ad una persona di afferrare, o una mano.

    
risposta data 13.03.2015 - 19:18
fonte

Leggi altre domande sui tag