Strategy Pattern (padrão de desenho)/Patos

From Wiki**3

< Strategy Pattern (padrão de desenho)

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.