Strategy (Design Pattern)

Aus Byte-Welt Wiki
Version vom 9. Januar 2012, 13:19 Uhr von AndreUhres (Diskussion | Beiträge) (Strategy (Design Pattern))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

Das Strategy Design Pattern definiert eine Familie von Algorithmen, isoliert jeden einzelnen und macht ihn austauschbar unabhängig von den Clients, die ihn zu benutzen.

Beispiel:

Stell dir eine Person vor, die sich mit ihrem Namen vorstellt: "Hallo, ich bin [Name der Person]". Zuerst spricht sie normal und dann durch ein Megaphon. Der entsprechende Java Code könnte etwa so aussehen: <code=java> public class Beispiel {

   public Beispiel() {
       Person person = new Person("Peter");
       String text = "'Hallo, Ich bin " + person.getName() + "'";
       Talking talkingNormally = new TalkingNormally();
       person.setTalking(talkingNormally);
       person.talk(text);
       Talking talkingMegaphone = new TalkingMegaphone();
       person.setTalking(talkingMegaphone);
       person.talk(text);
   }
   public static void main(final String args[]) {
       Beispiel test = new Beispiel();
   }

} </code=java> Mit "setTalking" wird die Sprechart der Person festgelegt, damit sie dann mit "talk" in der richtigen Art spricht. "Talking" ist ein Interface, das ebenfalls eine "talk"-Methode enthält. Das Interface wird von "TalkingNormally" und "TalkingMegaphone" implementiert, um die zwei Sprecharten zu konkretisieren. Die "talk"-Methode der "Person" delegiert einfach an das zuständige "Talking"-Objekt, damit die Person in der gewollten Art spricht: <code=java> public class Person {

   private final String name;
   private Talking talking;
   public Person(final String name) {
       this.name = name;
   }
   public String getName() {
       return name;
   }
   public void talk(final String text) {
       talking.talk(text);
   }
   public void setTalking(final Talking talking) {
       this.talking = talking;
   }

} </code=java> <code=java> public interface Talking {//oder alternativ eine abstrakte Klasse

   public void talk(final String text);

} </code=java> <code=java> public class TalkingNormally implements Talking {

   @Override
   public void talk(final String text) {
       System.out.println("Talking normally: " + text);
   }

} </code=java> <code=java> public class TalkingMegaphone implements Talking {

   @Override
   public void talk(final String text) {
       System.out.println("Talking with megaphone: " + text);
   }

} </code=java>