Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.3 kB
7
Indexable
// 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 +
                '}';
    }
}