Lekcja 12

Wzorce Projektowe

Na tych zajęciach będziemy tworzyli aplikację, która będzie składać się z 2 okien. Jedno będzie wpływać na działanie drugiego w sposób dynamiczny.

Singleton

Pojedynczy obiekt, który jest dostępny w każdym miejscu projektu.

Jest postrzegany za antywzorzec.

Praktyka

Wielkie firmy (Google, RedHat etc.) często używają tego antywzorca, trudno się z nim nie spotkać.

Rady
  • Singleton nie rozwiąże wszystkich problemów (i tak kod sam się nie napisze).
  • Przy złożonych projektach staje się miejscem pełnym niskiej jakości kodu i często trzeba było przepisywać projekt od 0.
  • Pozwala dość szybko uzyskać efekt "działa" - lubianego przez studentów.

I. Programowanie singletona


Zadanie 0

Zwróć uwagę na pole statyczne oraz prywatny(!) konstruktor:


public class SlidesApplication {

    private static SlidesApplication instance;

    public static SlidesApplication getInstance() {
        if (instance == null) {
            instance = new SlidesApplication();
        }
        return instance;
    }

    private SlidesApplication() {
    }

}

Klasa obrazuje byt pojedynczego slajdu:


public class Slide {

    private String message;
    private String title;

    public Slide(String message, String title) {
        this.message = message;
        this.title = title;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
                    

II. Kręgosłup całej aplikacji


Zadanie 1

Rozwińmy główną klasę aplikacji:


public class SlidesApplication {

    private static SlidesApplication instance;

    private Map<String, Stage> stageMap;
    private int currentSlide;
    private List<Slide> slideData;

    public static SlidesApplication getInstance() {
        if (instance == null) {
            instance = new SlidesApplication();
        }
        return instance;
    }

    private SlidesApplication() {
        stageMap = new HashMap<>();
        slideData = new ArrayList<>();
        currentSlide = 0;
        initSlidesData();
    }
    
    public void registerStage(String name, Stage stage) {
        stageMap.put(name, stage);
    }

    public void loadScene(String stageName, Scene scene) {
        Stage stage = stageMap.get(stageName);
        stage.setScene(scene);
    }

    private void initSlidesData() {
        slideData.add(new Slide("Podpowiedź dla prelegenta 0", "Slajd 0"));
        slideData.add(new Slide("Podpowiedź dla prelegenta 1", "Slajd 1"));
        slideData.add(new Slide("Podpowiedź dla prelegenta 2", "Slajd 2"));
    }

    public Scene renderScene() {
        Slide current = slideData.get(currentSlide);
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/slide.fxml"));

        SlideController controller = new SlideController(current);
        loader.setController(controller);
        try {
            Pane pane = loader.load();
            return new Scene(pane);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void createSlideStage() {
        Stage stage = new Stage();
        stage.setTitle("SlideStage");
        stage.setScene(renderScene());
        stage.show();
        registerStage("SlideStage", stage);
    }

    // TODO Zmienić index obecnego slajdu
    // TODO Zwrócić scenę dla projektora slajdów
    public Scene turnLeft() {
        return null;
    }

    // TODO Analogicznie dla turnLeft(), ale w przeciwną stronę
    public Scene turnRight() {
        return null;
    }

    // TODO Musimy zwracać informację o podpowiedzi dla prelegenta
    public String currentMessage() {
        return null;
    }
}
Zadanie 2

Przeanalizuj kod klasy SlidesApplication, a następnie uzupełnij kod brakujących metod.

Tym razem kodu jest za dużo, żeby kopiować kod ze strony do projektu, wklejam link do pobrania katalogu src projektu. Znajdą się tam dwie pary plików (.java + .fxml) dla dwóch okien.

Pobierz kod źródłowy
Zadanie 3

Upewnij się, że nie mogą pojawić się żadne wyjątki w czasie testowania aplikacji.

Zadanie 4

Rozwiń projekt:

  • Niech slajd zawiera więcej informacji (nie tylko tytuł, ale dodatkowy blok tekstu)
  • Niech slajd będzie zawierał własny obraz (w formie tła slajdu)
  • Poformatuj tekst tak, aby był półprzezroczysty (własność css opacity)