Strategy (Design Pattern)

Aus Byte-Welt Wiki
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 benutzen.

Beispiel:

Stell dir eine Person vor, die sich mit ihrem Namen vorstellt: "Hallo, ich bin [Name der Person]". Zuerst spricht sie normal. Aber dann bemerkt sie, dass nicht alle zuhören und ändert sozusagen ihre "Strategie" indem sie durch ein Megaphon spricht. 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: Strategy.jpg <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>