Strategy Pattern (padrão de desenho): Difference between revisions

From Wiki**3

No edit summary
Line 1: Line 1:
{{TOCright}}
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.
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.


Line 85: Line 86:


[[category:OOP]]
[[category:OOP]]
[[category:Teaching]]

Revision as of 00:18, 26 July 2007

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.


 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!"); }
}
public class RubberDuck extends Duck {
       public RubberDuck() {
               flyBehavior = new FlyNoWay();
               quackBehavior = new Squeak();
       }
       public void display() { System.out.println("I'm a rubber duckie"); }
}
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"); }
}

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.