Per implementare l'esempio descritto nell'
articolo precedente usando il pattern Strategy, incominciamo col creare la classe astratta
PlotStrategy, che costituirà la base per la creazione di tutte le strategie di esecuzione e si interfaccerà con il
Context:
<span style="font-size:1.0em">public abstract class PlotStrategy extends JFrame{ protected float[] x, y;
protected Color color;
protected int width, height;
public PlotStrategy(String title) {super(title);
width = 300; height =200;
color = Color.black;
addWindowListener(new WindAp(this));
}
//tutte le classi eredi dovranno implementare un proprio metodo <i>plot</i>
public abstract void plot(float xp[], float yp[]);
public void setPenColor(Color c) {color = c;}
class WindAp extends WindowAdapter{JFrame fr;
public WindAp(JFrame f) {fr = f; }public void WindowClosing(WindowEvent e) {fr.setVisible(false);}}
//la selezione di una delle due strategie da usare per il <i>plot</i> avverrà all’interno di un oggetto <i>Context</i>
public class Context{
//creiamo un’istanza della classe astratta <i>PlotStrategy</i> all’interno del <i>Context</i>
private <i>PlotStrategy</i> <i>plotStrategy</i>;
float x[], y[];
//i dati verranno visualizzati come diagramma lineare per default
public Context() {setLinePlot();}
//se si sceglie la visualizzazione tramite diagramma lineare
public void setLinePlot()
{ plotStrategy = new LinePlotStrategy(); }
//se la strategia scelta è la visualizzazione tramite istogramma
public void setBarPlot()
{ plotStrategy = new BarPlotStrategy(); }
//effettua una chiamata al metodo <i>plot</i> della strategia corrente
public void plot() { plotStrategy.plot(x, y); }
public void setPenColor(Color c) { plotStrategy.setPenColor(c); }
public void readData(String filename){ }}
//creiamo il pulsante per la scelta della visualizzazione tramite diagramma lineare
public class JGraphButton extends JButton implements Command {Context context;
//il costruttore riceve come parametro un oggetto <i>Context</i>
public JGraphButton(ActionListener act, Context ctx){super("Line graph"); addActionListener(act);
context = ctx;
//il client comunica al <i>Context</i> la propria scelta ed è il <i>Context</i> a richiamare i metodi adatti
public void Execute() {context.setPenColor(Color.red);
context.setLinePlot();
context.readData("data.txt");
//legge i dati e ne effettua il <i>plottaggio</i> usando il metodo <i>plot</i> dell’oggetto <i>Context</i>, che richiama il metodo plot della scelta corrente, la scelta “diagramma lineare” nel nostro caso
context.plot();
}
}
…</span>
Come si può facilmente intuire, l’implementazione del pulsante per la scelta della visualizzazione a istogramma è molto simile. Ora manca solo l’implementazione concreta degli algoritmi di scelta per il diagramma lineare e per l’istogramma.