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()
suFolder
chiamasize()
su tutti membroNodes
s, non c'è nessuna condizione che proteggesize()
chiama membroNode
s. Se esistesse una condizione che proteggevasize()
chiamate sui bambiniNode
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?