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

From Wiki**3

Root (talk | contribs)
No edit summary
Root (talk | contribs)
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{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 8: 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() {
[[category:PO Exemplos]]
                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]]

Latest revision as of 12:02, 19 November 2015

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

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