// Interfejs Stanu
interface Stan {
void wkladanieMonety();
void przekrecanieGalki();
void wydawanieGumy();
void zwracanieMonety();
}
// Stan BRAK_GUM
class StanBrakGum implements Stan {
private final Maszyna maszyna;
public StanBrakGum(Maszyna maszyna) {
this.maszyna = maszyna;
}
@Override
public void wkladanieMonety() {
System.out.println("Nie możesz włożyć monety, maszyna jest pusta - brak gum");
}
@Override
public void przekrecanieGalki() {
System.out.println("Przekręciłeś gałkę, ale w automacie brak kulek gumowych");
}
@Override
public void wydawanieGumy() {
System.out.println("Błąd - Nie wydano gumy do żucia");
}
@Override
public void zwracanieMonety() {
System.out.println("Nie możesz zwrócić monety której nie włożyłeś");
}
}
// Stan NIE_MA_MONETY
class StanNieMaMonety implements Stan {
private final Maszyna maszyna;
public StanNieMaMonety(Maszyna maszyna) {
this.maszyna = maszyna;
}
@Override
public void wkladanieMonety() {
System.out.println("Włożyłeś monetę");
maszyna.ustawStan(maszyna.getStanJestMoneta());
}
@Override
public void przekrecanieGalki() {
System.out.println("Przekręciłęś gałkę do wydania gumy ale nie włożyłęś monety");
}
@Override
public void wydawanieGumy() {
System.out.println("Błąd - Musisz najpierw zapłacić");
}
@Override
public void zwracanieMonety() {
System.out.println("Nie włożyłeś monety");
}
}
// Stan JEST_MONETA
class StanJestMoneta implements Stan {
private final Maszyna maszyna;
public StanJestMoneta(Maszyna maszyna) {
this.maszyna = maszyna;
}
@Override
public void wkladanieMonety() {
System.out.println("Nie możesz włożyć kolejnej monety");
}
@Override
public void przekrecanieGalki() {
System.out.println("Przekręciłeś gałkę i otrzymujesz gumę");
maszyna.ustawStan(maszyna.getStanGumaSprzedana());
maszyna.wydawanieGumy();
}
@Override
public void wydawanieGumy() {
System.out.println("Błąd - Nie wydano gumy do żucia");
}
@Override
public void zwracanieMonety() {
System.out.println("Moneta zwrócona");
maszyna.ustawStan(maszyna.getStanNieMaMonety());
}
}
// Stan GUMA_SPRZEDANA
class StanGumaSprzedana implements Stan {
private final Maszyna maszyna;
public StanGumaSprzedana(Maszyna maszyna) {
this.maszyna = maszyna;
}
@Override
public void wkladanieMonety() {
System.out.println("Proszę czekać na zakończenie poprzedniej operacji czyli wydania gumy");
}
@Override
public void przekrecanieGalki() {
System.out.println("Dwukrotne przekręcenie gałki nie da ci kolejnej gumy!");
}
@Override
public void wydawanieGumy() {
System.out.println("Guma wysuwa się z automatu");
maszyna.liczbaGum = maszyna.liczbaGum - 1;
if (maszyna.liczbaGum == 0) {
System.out.println("Ups, brak kulek gumowych!");
maszyna.ustawStan(maszyna.getStanBrakGum());
} else {
maszyna.ustawStan(maszyna.getStanNieMaMonety());
}
}
@Override
public void zwracanieMonety() {
System.out.println("Już przekręciłeś gałkę i wydano gumę, nie można już zwrócić monety");
}
}
public class Maszyna {
private Stan stanBrakGum;
private Stan stanNieMaMonety;
private Stan stanJestMoneta;
private Stan stanGumaSprzedana;
private Stan stan;
int liczbaGum = 0;
public Maszyna(int count) {
this.liczbaGum = count;
stanBrakGum = new StanBrakGum(this);
stanNieMaMonety = new StanNieMaMonety(this);
stanJestMoneta = new StanJestMoneta(this);
stanGumaSprzedana = new StanGumaSprzedana(this);
if (count > 0) {
stan = stanNieMaMonety;
} else {
stan = stanBrakGum;
}
}
public void wkladanieMonety() {
stan.wkladanieMonety();
}
public void przekrecanieGalki() {
stan.przekrecanieGalki();
}
public void wydawanieGumy() {
stan.wydawanieGumy();
}
public void zwracanieMonety() {
stan.zwracanieMonety();
}
public void ustawStan(Stan stan) {
this.stan = stan;
}
public Stan getStanBrakGum() {
return stanBrakGum;
}
public Stan getStanNieMaMonety() {
return stanNieMaMonety;
}
public Stan getStanJestMoneta() {
return stanJestMoneta;
}
public Stan getStanGumaSprzedana() {
return stanGumaSprzedana;
}
public void uzupelnijGumy(int numGumBalls) {
this.liczbaGum = numGumBalls;
stan = stanNieMaMonety;
}
@Override
public String toString() {
return "Maszyna{" +
"stan=" + stan +
", liczbaGum=" + liczbaGum +
'}';
}
}