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.