|
|
| (5 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| {{NAVPO}} | | {{NAVPO}} |
| <!--{{TOCright}}-->
| | {{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 9: |
Line 9: |
| [[Image:strategy-dpcd.png|600px]] | | [[Image:strategy-dpcd.png|600px]] |
|
| |
|
| ==Exemplo== | | ==Exemplos== |
|
| |
|
| Duck, Fly, Quack.
| | * [[Strategy Pattern (padrão de desenho)/Patos|Patos]] |
| | * [[Strategy Pattern (padrão de desenho)/Galinha com fome|Galinha com fome]] |
|
| |
|
| Comentários em breve.
| | == Exercícios == |
|
| |
|
| <java5>
| | * [[Strategy Pattern (padrão de desenho)/Exercício 01: Ordenação de Gatos|Exercício 01: Ordenação de Gatos]] |
| 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>
| | [[category:Ensino]] |
| public class RubberDuck extends Duck {
| | [[category:PO]] |
| 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.
| |
| | |
| [[category:OOP]] | |
| [[category:Teaching]] | |
| [[category:PO Exemplos]] | | [[category:PO Exemplos]] |
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:
Exemplos
Exercícios