Celem wzorca projektowego fasada jest ukrycie klas i funkcji aplikacji, do których dany użytkownik nie powinien mieć dostępu. Odbywa się to za pomocą dodatkowej klasy „fasadowej”, w której znajdują się funkcje odnoszące się do docelowych, ukrywanych klas. Jest to bardzo przydatny wzorzec w przypadku aplikacji, w których użytkownicy mają różne poziomy dostępu.

Schemat działania tego wzorca prezentuje się następująco:

Przykładowo na prostej aplikacji bankowej zastosowanie tego wzorca wyglądałoby następująco:

import bank.AtmMachine;
import bank.BankSystem;

public class Main {
    public static void main(String[] args) {
        AtmMachine atmMachine = new AtmMachine();
        BankSystem bankSystem = new BankSystem();

        atmMachine.enterPin();
        if (bankSystem.validatePin() && bankSystem.validateTransaction()){
            atmMachine.withdrawCash();
        }
    }
}
package bank;

public class AtmMachine {
    public void checkBalance(){

    }

    public void enterPin(){
        System.out.println("PIN entered.");
    }

    public void withdrawCash(){
        System.out.println("Cash withdrawn successfully!");
    }
}

package bank;

public class BankSystem {
    public void transferMoney(){

    }

    public boolean validatePin(){
        System.out.println("PIN number validated.");
        return true;
    }

    public boolean validateTransaction(){
        System.out.println("Transaction validated.");
        return true;
    }

    public void getTransactionHistory(){

    }
}

Po dodaniu klasy fasadowej oraz niewielkich zmianach w kodzie program ten wygląda następująco:

import bank.AtmMachineFacade;

public class Main {
    public static void main(String[] args) {

        AtmMachineFacade atmMachineFacade = new AtmMachineFacade();
        atmMachineFacade.withdrawMoney();
    }
}
package bank;

class AtmMachine {
    void checkBalance(){

    }

    void enterPin(){
        System.out.println("PIN entered.");
    }

    void withdrawCash(){
        System.out.println("Cash withdrawn successfully!");
    }
}

package bank;

class BankSystem {
    void transferMoney(){

    }

    boolean validatePin(){
        System.out.println("PIN number validated.");
        return true;
    }

    boolean validateTransaction(){
        System.out.println("Transaction validated.");
        return true;
    }

    void getTransactionHistory(){

    }
}

package bank;

public class AtmMachineFacade {
    private AtmMachine atmMachine;
    private BankSystem bankSystem;

    public AtmMachineFacade() {
        atmMachine = new AtmMachine();
        bankSystem = new BankSystem();
    }

    public void withdrawMoney(){
        atmMachine.enterPin();
        if (bankSystem.validatePin() && bankSystem.validateTransaction()){
            atmMachine.withdrawCash();
        }
    }
}

W wyniku zmian klasy AtmMachine i BankSystem stały się niepubliczne, a kod w klasie głównej stał się bardziej przejrzysty.