Strategy Pattern (padrão de desenho): Difference between revisions
From Wiki**3
| Line 12: | Line 12: | ||
Duck, Fly, Quack. | 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 >>"); } | |||
} | |||
[[category:PO 2005/2006]] | [[category:PO 2005/2006]] | ||
Revision as of 18:56, 21 November 2006
Material correspondente à aula 26.
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.
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 >>"); }
}