Strategy Pattern (padrão de desenho)

From Wiki**3

Revision as of 13:18, 12 November 2008 by Root (talk | contribs)

O padrão "stategy" permite a definição de uma família de algoritmos (representando uma estratégia para a resolução de um problema) e, ao encapsular cada um numa classe, faz com que sejam intercambiáveis. Este padrão permite que um algoritmo varie de forma independente dos seus clientes.

Estrutura

O padrão strategy tem a seguinte estrutura de classes:

Strategy-dpcd.png

Exemplo

Duck, Fly, Quack.

Comentários em breve.

<java5>

 public abstract class Duck {
       FlyBehavior   flyBehavior;
       QuackBehavior quackBehavior;

       public Duck() {}

       public void setFlyBehavior(FlyBehavior fb)     { flyBehavior   = fb; }
       public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; }

       abstract void display();

       public void performFly()   { flyBehavior.fly();     }
       public void performQuack() { quackBehavior.quack(); }
       public void swim() { System.out.println("All ducks float, even decoys!"); }
}

</java5>

<java5>

public class RubberDuck extends Duck {
       public RubberDuck() {
               flyBehavior = new FlyNoWay();
               quackBehavior = new Squeak();
       }
       public void display() { System.out.println("I'm a rubber duckie"); }
}

</java5>

<java5>

public class RedHeadDuck extends Duck {
       public RedHeadDuck() {
               flyBehavior = new FlyWithWings();
               quackBehavior = new Quack();
       }
       public void display() { System.out.println("I'm a real Red Headed duck"); }
}

</java5>

Comportamento de Voo

Este comportamento está relacionado com a forma de voar do pato: existe uma família de comportamentos de voo. Os elementos desta família podem ser associados a patos, alterando-se desse modo o comportamento do pato em voo.

public interface FlyBehavior { public void fly(); }
public class FlyWithWings implements FlyBehavior {
  public void fly() { System.out.println("I'm flying!!"); }
}
public class FlyNoWay implements FlyBehavior {
  public void fly() { System.out.println("I can't fly"); }
}
public class FlyRocketPowered implements FlyBehavior {
  public void fly() { System.out.println("I'm flying with a rocket"); }
}

Comportamento de Grasnar

Este comportamento está relacionado com a forma de grasnar do pato: tal como para o voo, existe uma família de comportamentos de grasnar. Os elementos desta família podem ser associados a patos, alterando-se desse modo o comportamento do pato, relativamente à acção de grasnar.

public interface QuackBehavior { public void quack(); }
public class Quack implements QuackBehavior {
  public void quack() { System.out.println("Quack"); }
}
public class Squeak implements QuackBehavior {
  public void quack() { System.out.println("Squeak"); }
}
public class MuteQuack implements QuackBehavior {
  public void quack() { System.out.println("<< Silence >>"); }
}

Mais informação sobre este exemplo particular pode ser obtida no livro Head First Design Patterns.