Strategy Pattern (padrão de desenho): Difference between revisions
From Wiki**3
No edit summary |
|||
Line 82: | Line 82: | ||
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. | 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. | ||
<java5> | |||
public interface QuackBehavior { public void quack(); } | public interface QuackBehavior { public void quack(); } | ||
</java5> | |||
<java5> | |||
public class Quack implements QuackBehavior { | public class Quack implements QuackBehavior { | ||
public void quack() { System.out.println("Quack"); } | public void quack() { System.out.println("Quack"); } | ||
} | } | ||
</java5> | |||
<java5> | |||
public class Squeak implements QuackBehavior { | public class Squeak implements QuackBehavior { | ||
public void quack() { System.out.println("Squeak"); } | public void quack() { System.out.println("Squeak"); } | ||
} | } | ||
</java5> | |||
<java5> | |||
public class MuteQuack implements QuackBehavior { | public class MuteQuack implements QuackBehavior { | ||
public void quack() { System.out.println("<< Silence >>"); } | public void quack() { System.out.println("<< Silence >>"); } | ||
} | } | ||
</java5> | |||
Mais informação sobre este exemplo particular pode ser obtida no livro Head First Design Patterns. | Mais informação sobre este exemplo particular pode ser obtida no livro Head First Design Patterns. |
Revision as of 15:03, 12 November 2008
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:
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.
<java5>
public interface FlyBehavior { public void fly(); }
</java5>
<java5>
public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("I'm flying!!"); } }
</java5>
<java5>
public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println("I can't fly"); } }
</java5>
<java5>
public class FlyRocketPowered implements FlyBehavior { public void fly() { System.out.println("I'm flying with a rocket"); } }
</java5>
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.
<java5>
public interface QuackBehavior { public void quack(); }
</java5>
<java5>
public class Quack implements QuackBehavior { public void quack() { System.out.println("Quack"); } }
</java5>
<java5>
public class Squeak implements QuackBehavior { public void quack() { System.out.println("Squeak"); } }
</java5>
<java5>
public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<< Silence >>"); } }
</java5>
Mais informação sobre este exemplo particular pode ser obtida no livro Head First Design Patterns.