Il pattern Strategy

Pattern Strategy: fornire più algoritmi per un unico problema

Il pattern Strategy consente di offrire differenti algoritmi per la risoluzione di un problema. Gli algoritmi possono variare in maniera indipendente dalla strategia che li utilizza, se ne possono aggiungere altri di volta in volta.
La soluzione fornita dal pattern Strategy consiste nel fornire una superclasse con una versione più generale dell’algoritmo e varie sottoclassi che la estendono. Per queste ragioni, si tratta di un pattern di tipo comportamentale in quanto forniscono delle soluzione alle più comuni tipologie di interazione tra gli oggetti, si occupano quindi del “comportamento”.

Il pattern Strategy è così definito:

  1. Contesto: quando ci sono classi simili che differiscono nel loro comportamento per un determinato metodo. In questo caso il pattern offre la possibilità di raggrupparle e di renderle facilmente intercambiabili. Oppure, quando ci sono differenti varianti di uno stesso algoritmo e l’algoritmo usa dei dati che i client non dovrebbero conoscere, il pattern Strategy consente di non esporre queste strutture dati. Inoltre quando una classe definisce diversi comportamenti che vengono attivati in conseguenza di istruzioni condizionali (if/else), da spostare nelle rispettive classi Strategy;
  2. Problema affrontato: dare la possibilità di variare le strategie per risolvere un problema in maniera agevole;
  3. Soluzione: definire una interfaccia comune per tutte le strategie ed istanziare le classi concrete per ciascuna strategia. Il client che vuole utilizzare le strategie vi accederà tramite le interfacce.

Il pattern Strategy

Dalla rappresentazione grafica possiamo notare la presenta di Context, che rappresenta il contesto applicativo del problema e mantiene un riferimento alla strategia da applicare; Strategy, l’interfaccia comune per le diversione versione dell’algoritmo (AlgorithmInterface); ed infine ConcreteStrategy che implementa l’interfaccia e fornisce la propria versione di AlgorithmInterface.

I vantaggi nell’utilizzo di questo pattern sono molti, fornisce un’alternativa ad ereditarietà dalla classe Context per avere una varietà di algoritmi e di comportamenti; consente di evitare l’uso di complesse istruzioni condizionali e di implementare in maniera diversa uno stesso comportamento. Gli svantaggi consistono nel numero maggiore di oggetti da gestire e che tutti gli algoritmi sono obbligati ad implementare la stessa interfaccia.

LayoutManager, un esempio del pattern Strategy in Java

Il pattern Strategy

Un tipico esempio di applicazione del pattern Strategy è nelle GUI con i layout. I possibili layout di una finestra implementano un’interfaccia in comune chiamata LayoutManager; i possibili layout nel package java.swing sono: GridLayout, che ordina per righe e colonne; FlowLayout, che ordina con il minimo spazio possibile e si ridimensiona se si cambia la dimensione della finestra; BoxLayout che utilizza dei box; Borderlayout, usato per defalut; CardLayout e GridBagLayout. Tutte le classi che implementano l’interfaccia LayoutManager, dovranno dichiarare determinati metodi, tra cui:

  1. Dimension minimumLayoutSize(Container parent), che restituisce le dimensioni minime richieste da questo layout;
  2. Dimension preferredLayoutSize(Container parent), che si occupa di restituire le dimensioni ideali secondo questo layout;
  3. void layoutContainer(Container parent), che dispone gli elementi secondo questo layout.

Per specificare un layout si adopera l’istruzione:

  getContentPane().setLayout(new FlowLayout());

Un esempio d’utilizzo del FlowLayout è il seguente:

  import java.awt.Container;
  import java.awt.*;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  public class Test extends JFrame {
    public static void main(String[] args) {
      new Test().setVisible(true);
    }
    public test() {
      this.setSize(200, 160);
      Container contentPane = this.getContentPane();
      contentPane.setLayout(new FlowLayout()); //!//
      contentPane.add(new JButton("1"));
      contentPane.add(new JButton("2"));
      contentPane.add(new JButton("3"));
      contentPane.add(new JButton("4"));
      contentPane.add(new JButton("5"));
      contentPane.add(new JButton("6"));
      contentPane.add(new JButton("7"));
      contentPane.add(new JButton("8"));
      contentPane.add(new JButton("9"));
    }
  }

Di conseguenza avremo che tutti i bottoni verranno posizioni in orizzontale finché c’è spazio. Un’eventuali ridimensionamento della finestra comporta una nuova disposizione degli elementi.

Un altro esempio tipico d’utilizzo del pattern Strategy è quando si vuole offrire differenti algoritmi di ordinamento.

Per la lista completa di tutti i design pattern fate riferimento a questa pagina.

Pubblicato in Design Pattern, Guide, Java, Programmazione Taggato con: , , , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*