Wzorzec projektowy Strategy

Zadanie programistyczne

Utworzyć aplikację pozwalająca na tworzenie smoków.
Wszystkie smoki zbierają skarby tak samo.
Wszystkie smoki przedstawiają się, ale każdy inaczej.
Smok może albo być nielotem, albo szybować, albo latać przy użyciu skrzydeł.
Smok może albo nie zionąć ogniem albo zionąć ogniem używając albo ropy,
albo alkoholu albo metanu.
Każda czynność jest wykonywana przy użyciu metody, ale na razie w metodach jest tylko opis wykonywania czynności.

Rozwiązanie

Dla metod zmiennych tworzymy interfejsy zawierające stosowną metodę:
Sposób latania: fly();
Sposób ziania: fire();
Interfejsy są implementowane przez klasy opisujące poszczególne sposoby latania
albo sposoby ziania: Nielot, Skrzydla, Szybowanie
albo Alkohol, BezOgnia, Metan, Ropa
Tworzymy klasę Smok posiadającą pola SposobZiania, SposobLatania.
Dodajemy dwie metody pozwalające ustawić każdy z tych sposobów
Tworzymy odziedziczalną metodę zbierajSkarby().
Tworzymy abstrakcyjna metodę przedstawSie().
Potem tworzymy konkretne smoki dziedziczące po klasie Smok:
np. SmokWawelski i ustawiamy mu SposobZiania i SposobLatania
Dodajemy implementację metody przedstawSie()

Potem już możemy tworzyć smoki rożnych klas. Każdemu z nich można w każdej
chwili zmienić SposobZiania lub SposobLatania.

Klasy

Pakiet latanie

Klasa Nielot
package strategy.latanie;
public class Nielot implements SposobLatania {
    @Override
    public void fly() {
        System.out.println("Nie mam skrzydeł. Nie mogę latać...");
    }
}
Klasa Skrzydla
package strategy.latanie;
public class Skrzydla implements SposobLatania {
    @Override
    public void fly() {
        System.out.println("Mam skrzydła. Mogę latać.");
    }
}
Klasa SposobLatania
package strategy.latanie;
public interface SposobLatania {
    public void fly();
}
Klasa Szybowanie
package strategy.latanie;
public class Szybowanie implements SposobLatania {
    @Override
    public void fly() {
        System.out
                .println("Mam skrzydła. Nie mogę ich użyć do latania, ale mogę szybować ...");
    }
}

Pakiet ogien

Klasa Alkohol
package strategy.ogien;
public class Alkohol implements SposobZiania {
    @Override
    public void fire() {
        System.out.println("Zapalam ogień przy użyciu alkoholu");
    }
}
Klasa BezOgnia
package strategy.ogien;
public class BezOgnia implements SposobZiania {
    @Override
    public void fire() {
        System.out.println("Nie potrafię zionąć ogniem");
    }
}
Klasa Metan
package strategy.ogien;
public class Metan implements SposobZiania {
    @Override
    public void fire() {
        System.out.println("Używam metanu");
    }
}
Klasa Ropa
package strategy.ogien;
public class Ropa implements SposobZiania {
    @Override
    public void fire() {
        System.out.println("Używam ropy naftowej");
    }
}
Klasa SposobZiania
package strategy.ogien;
public interface SposobZiania {
    public void fire();
}

Pakiet smok

Klasa Smok
package strategy.smok;
import strategy.latanie.SposobLatania;
import strategy.ogien.SposobZiania;
public abstract class Smok {
    SposobLatania sposobLatania;
    SposobZiania sposobZiania;
    public Smok() {
    }
    public void ustawSposobLatania(SposobLatania sposobLatania) {
        this.sposobLatania = sposobLatania;
    }
    public void ustawSposobZiania(SposobZiania sposobZiania) {
        this.sposobZiania = sposobZiania;
    }
    public void lataj() {
        sposobLatania.fly();
    }
    public void zionOgniem() {
        sposobZiania.fire();
    }
    public void zbierajSkarby() {
        System.out.println("Wszystkie smoki zbierają skarby. Ja też");
    }
    public abstract void przedstawSie();
}
Klasa SmokVollys
package strategy.smok;
import strategy.latanie.Skrzydla;
import strategy.ogien.Metan;
public class SmokVollys extends Smok {
    public SmokVollys() {
        ustawSposobLatania(new Skrzydla());
        ustawSposobZiania(new Metan());
    }
    @Override
    public void przedstawSie() {
        System.out.println("Jestem Smok Vollys");
    }
}
Klasa SmokWawelski
package strategy.smok;
import strategy.latanie.Nielot;
import strategy.ogien.Alkohol;
public class SmokWawelski extends Smok {
    public SmokWawelski() {
        ustawSposobLatania(new Nielot());
        ustawSposobZiania(new Alkohol());
    }
    @Override
    public void przedstawSie() {
        System.out.println("Jestem Smok Wawelski");
    }
}

Pakiet mains

Klasa UtworzSmoka
package strategy.mains;
import strategy.ogien.Ropa;
import strategy.smok.Smok;
import strategy.smok.SmokVollys;
import strategy.smok.SmokWawelski;
public class UtworzSmoka {
    public static void main(String[] args) {
        Smok wawelski = new SmokWawelski();
        wawelski.przedstawSie();
        wawelski.zionOgniem();
        wawelski.lataj();
        wawelski.zbierajSkarby();
        Smok vollys = new SmokVollys();
        vollys.przedstawSie();
        vollys.zionOgniem();
        vollys.lataj();
        vollys.zbierajSkarby();
        //-
        vollys.ustawSposobZiania(new Ropa());
        vollys.zionOgniem();
    }
}

Wynik

Jestem Smok Wawelski
Zapalam ogień przy użyciu alkoholu
Nie mam skrzydeł. Nie mogę latać...
Wszystkie smoki zbierają skarby. Ja też
Jestem Smok Vollys
Używam metanu
Mam skrzydła. Mogę latać.
Wszystkie smoki zbierają skarby. Ja też
Używam ropy naftowej

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *