Sono abbastanza nuovo con i modelli e sto studiando Decorator Pattern per un programma che devo scrivere.Decorator Pattern design
Studiando online, ho trovato un esempio di un modello Decorator (è Java pseudo-codice):
class Solution1
{
static interface Component
{
void doStuff();
}
static class MyComponent implements Component
{
public void doStuff()
{
// ...
}
}
static class ComponentDecorator implements Component // This is the Decorator pattern.
{
private final Component component;
public ComponentDecorator(Component component)
{
this.component = component;
}
public void doStuff()
{
this.component.doStuff();
}
}
static class ComponentDecorator1 extends ComponentDecorator
{
public ComponentDecorator1(Component component)
{
super(component);
}
private void doExtraStuff1()
{
// ...
}
public void doStuff()
{
super.doStuff();
doExtraStuff1();
}
}
static class ComponentDecorator2 extends ComponentDecorator
{
public ComponentDecorator2(Component component)
{
super(component);
}
private void doExtraStuff2()
{
// ...
}
public void doStuff()
{
super.doStuff();
doExtraStuff2();
}
}
public static void main(String[] args)
{
MyComponent c = new MyComponent();
ComponentDecorator1 cd1 = new ComponentDecorator1(c);
ComponentDecorator2 cd2 = new ComponentDecorator2(cd1);
cd2.doStuff(); // Executes Component.doStuff, ComponentDecorator1.doExtraStuff1, ComponentDecorator2.doExtraStuff2
}
};
Quando ho analizzato l'esempio, ho capito che in passato ho fatto un modello molto simile ma in modo diverso:
import java.util.*;
class Solution2
{
static interface Component
{
void doStuff();
}
static class MyComponent implements Component
{
public void doStuff()
{
// ...
}
}
static class ComponentDecorator implements Component // This is NOT the Decorator pattern!
{
private final List<Component> components = new ArrayList<Component>();
public ComponentDecorator()
{
}
public ComponentDecorator addComponent(Component component)
{
this.components.add(component);
return this;
}
public void removeComponent(Component component) // Can Decorator do this?
{
// ...
}
public void doStuff()
{
for(Component c : this.components) c.doStuff();
}
}
static class ComponentDecorator1 implements Component
{
public ComponentDecorator1()
{
}
private void doExtraStuff1()
{
// ...
}
public void doStuff()
{
doExtraStuff1();
}
}
static class ComponentDecorator2 implements Component
{
public ComponentDecorator2()
{
}
private void doExtraStuff2()
{
// ...
}
public void doStuff()
{
doExtraStuff2();
}
}
public static void main(String[] args)
{
ComponentDecorator cd = new ComponentDecorator();
cd.addComponent(new MyComponent());
cd.addComponent(new ComponentDecorator1());
cd.addComponent(new ComponentDecorator2());
cd.doStuff(); // Executes MyComponent.doStuff, ComponentDecorator1.doExtraStuff1, ComponentDecorator2.doExtraStuff2
}
}
a mio parere, il secondo esempio può essere utilizzato in medesime situazioni in cui un pattern Decorator può essere utilizzato, ma è più flessibile (si può, per esempio, rimuovere o riordinare i componenti del lista), quindi le mie domande:
- La soluzione 1 (modello decoratore corretto) è migliore della soluzione 2? Perché?
- È possibile aggiungere funzioni per la rimozione di istanze nella soluzione 1?
- È possibile aggiungere funzioni per riordinare le istanze nella soluzione 1?
è impossibile dire quale sia il migliore perché fanno cose diverse. –
Mi sembra che facciano la stessa cosa. Può essere più preciso? – Carlo
Decorator sta estendendo un'altra implementazione ** avvolgendola ** nel codice di estensione. La tua soluzione chiama solo diverse implementazioni in sequenza. Ecco [la mia risposta su decorator] (http://stackoverflow.com/questions/12379848/decorator-design-pattern-vs- eternity/12379948#12379948). Prova ad implementarlo con l'approccio alternativo che descrivi e vedrai la differenza –