Per semplicità, e anche per evidente similarità di contenuti, riportiamo solo la strategia “diagramma lineare”, che estenderà la classe astratta
PlotStrategy:
<span style="font-size:1.0em">public class LinePlotStrategy extends PlotStrategy{LinePlotPanel lp;
public LinePlotStrategy()
{super("Line plot");lp = new LinePlotPanel();
getContentPane().add(lp);
}
//viene sovrascritto il metodo <i>plot</i> della superclasse
public void plot(float[] xp, float[] yp){x = xp; y = yp;
findBounds();
setSize(width, height);
setVisible(true);
setBackground(Color.white);
lp.setBounds(minX, minY, maxX, maxY);
lp.plot(xp, yp, color);
repaint();
}
}</span>
Sia la classe
PlotPanel, che estende
JPanel, che le classi
LinePlotPanel e
BarPlotPanel, che ereditano da
PlotPanel metodi per ridurre in scala i dati ricevuti, hanno una valenza puramente grafica e tutt’e tre possono essere facilmente implementate da chi legge. Quello che ci interessa è come il
pattern Strategy abbia aggiunto un livello di astrazione e reso il nostro codice più mantenibile e riusabile. Il
Context (il comportamento) diventa un parametro utilizzato nel costruttore di una classe, che richiederà l’utilizzo di una strategia. L’oggetto
Context avrà sempre un riferimento alla classe astratta
Strategy, ma utilizzerà dinamicamente una
ConcreteStrategy precisa, il tutto senza ricorrere a
statement condizionali, che nel caso di molte strategie appesantirebbero il codice.
E se volessimo aggiungere un altro modo per
plottare i nostri dati, per esempio usando un diagramma a striscia? Basterebbe aggiungere una classe concreta, che estenda
PlotStrategy e, nel nostro caso, creare un
JButton che comunichi la richiesta al
Context, aggiungendo nella classe
Context un metodo in grado di accogliere la richiesta.