Návrhové vzory Java (design patterns): Facade

Dnes sa pozrieme na ďalší návrhový vzor Facade (java design patterns) z kategórie štrukturálnych vzorov (structural patterns). Návrhové vzory v tejto kategórii sa zaoberajú štruktúrou triedy, ako je dedičnosť (inheritance) a kompozícia (composition).

Čo je návrhový vzor Facade?

Facade (fasáda) je návrhový vzor, ktorý poskytuje zjednodušené rozhranie pre komunikáciu s komplexným systémom, ktorý môže pozostávať z viacerých tried, rozhraní a komponentov. Často sa využíva spolu s návrhovým vzorom Singleton.

Aký problém návrhový vzor Facade rieši?

Facade design pattern rieši problém komplexnosti tým, že poskytuje ako prístup klientovi jednoduché unifikované rozhranie, ktoré skrýva podrobnosti o vnútri systému, ktoré môže byť kvôli množstvu tried a vzájomných závislosti ťažko pochopiteľné a ovládateľné. Výhodou fasády je tiež, že komplexný systém sa môže meniť, bez ohľadu na klienta, ktorý komunikuje iba cez fasádu.

Príklad Facade implementácie v Jave

Teraz si napíšeme program na testovanie vlastností zadaných čísel. Použijeme pritom návrhový vzor Facade, ktorý skryje komplexnosť výpočtov pred používateľom.

Trieda SystemA obsahuje metódu jePrvocislo(), ktorá zistí, či zadané číslo je prvočíslo. Prvočíslo je číslo väčšie ako 1, ktoré nemá žiadne iné delitele okrem 1 a seba samého.

SystemA.java

package designpatterns;

public class SystemA {
    public boolean jePrvocislo(int cislo) {
        if (cislo <= 1) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(cislo); i++) {
            if (cislo % i == 0) {
                return false;
            }
        }
        return true;
    }
}

Trieda SystemB obsahuje metódu jeFibonacihoCislo(), ktorá zistí, či je zadané číslo členom postupnosti Fibonacciho. Postupnosť Fibonacciho je taká, že každé číslo v postupnosti je súčet dvoch predchádzajúcich čísel (napr. 0, 1, 1, 2, 3, 5, …).

SystemB.java

package designpatterns;

public class SystemB {
    public boolean jeFibonacihoCislo(int cislo) {
        int a = 0, b = 1, temp;
        while (a < cislo) {
            temp = a;
            a = b;
            b = temp + b;
        }
        return a == cislo;
    }
}

SystemC obsahuje metódu jeOdmocnitelne(), ktorá zistí, či je zadané číslo možné odmocniť bezozvyšku. Odmocnina je číslo, ktoré vynásobené samo so sebou dáva pôvodné číslo.

SystemC.java

package designpatterns;

public class SystemC {
    public boolean jeOdmocnitelne(int cislo) {
        if (cislo < 0) {
            return false;
        }
        int odmocnina = (int) Math.sqrt(cislo);
        return odmocnina * odmocnina == cislo;
    }
}

Trieda Fasada kombinuje predchádzajúce systémy a ich metódy prostredníctvom metódy komplexnaOperacia(), ktorá zanalyzuje zadané číslo a vráti výsledok v textovom reťazci.

Fasada.java

package designpatterns;

public class Fasada {
    private SystemA systemA;
    private SystemB systemB;
    private SystemC systemC;

    public Fasada() {
        systemA = new SystemA();
        systemB = new SystemB();
        systemC = new SystemC();
    }

    public String komplexnaOperacia(int cislo) {
        StringBuilder vysledok = new StringBuilder("Fasáda spúšťa analýzu čísla " + cislo + ":\n");
        vysledok.append("Systém A: Je prvočíslo? ").append(systemA.jePrvocislo(cislo)).append("\n");
        vysledok.append("Systém B: Je Fibonačiho číslo? ").append(systemB.jeFibonacihoCislo(cislo)).append("\n");
        vysledok.append("Systém C: Dá sa číslo odmocniť? ").append(systemC.jeOdmocnitelne(cislo));
        return vysledok.toString();
    }
}

Main trieda je vstupným bodom programu. Vytvára inštanciu fasády a volá jej metódu komplexnaOperacia() na ľubovoľnom zadanom čísle. V tomto príklade sme nastavili číslo na 1. Výsledok tejto operácie je potom vypísaný na konzolu.

Main.java

import designpatterns.Fasada;

public class Main {
    public static void main(String[] args) {
        Fasada fasada = new Fasada();
        // Môžeš zmeniť na akékoľvek iné číslo
        int zadaneCislo = 1;
        String vysledok = fasada.komplexnaOperacia(zadaneCislo);
        System.out.println(vysledok);
    }
}
Výstup z tohto príkladu Main.java
Výstup z tohto príkladu Main.java

Zhrnutie

Návrhový vzor Facade sa používa v situácii, keď potrebujeme schovať komplikovaný a ťažko zrozumiteľný kód komplexných systémov. Zabudovaním fasády medzi klienta a systém môže klient jednoducho interagovať s fasádou, ktorá zabezpečuje správne volanie komplexných operácií a skrýva detaily systému.

Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si kód Java Facade tu.

Ovládaš programovací jazyk Java? Ak hľadáš prácu ako Java programátor, pozri si naše firemné benefity a reaguj na najnovšie pracovné ponuky.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť