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