Façade

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Em padrões de projeto de software, um façade ("fachada" em inglês, palavra de origem francesa; comumente escrito em inglês sem o cedilha, mas ainda com som de /s/: facade) é um objeto que disponibiliza uma interface simplificada para uma das funcionalidades de uma API, por exemplo. Um façade pode:

  • tornar uma biblioteca de software mais fácil de entender e usar;
  • tornar o código que utiliza esta biblioteca mais fácil de entender;
  • reduzir as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema;
  • envolver uma interface mal desenhada, com uma interface melhor definida.

Um façade é um padrão de projeto (design pattern) do tipo estrutural. Os façades são muito comuns em projeto orientados a objeto. Por exemplo, a biblioteca padrão da linguagem Java contém dúzias de classes para processamento do arquivo fonte de um caractere, geração do seu desenho geométrico e dos pixels que formam este caractere. Entretanto, a maioria dos programadores Java não se preocupam com esses detalhes, pois a biblioteca contém as classes do tipo façade (Font e Graphics) que oferecem métodos simples para as operações relacionadas com fontes.

Estrutura[editar | editar código-fonte]

FacadeDesignPattern.png

Client1, Client2

Usuários da API

Façade

Define uma interface para os packages 1, 2 e 3, isolando-os do resto da aplicação.

Exemplo[editar | editar código-fonte]

Esse é um exemplo abstrato de como um cliente ("você") interage com um façade (o "computador") para um sistema complexo (as partes internas do computador como o processador e o disco rígido):

class CPU {
  public void freeze() { ... }
  public void jump(long position) { ... }
  public void execute() { ... }
}

class Memory {
  public void load(long position, byte[] data) { ... }
}

class HardDrive {
  public byte[] read(long lba, int size) { ... }
}

class Computer {
  private CPU cpu;
  private Memory memory;
  private HardDrive hardDrive;

  public Computer() {
    this.cpu = new CPU();
    this.memory = new Memory();
    this.hardDrive = new HardDrive();
  }

  public void startComputer() {
    cpu.freeze();
    memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
    cpu.jump(BOOT_ADDRESS);
    cpu.execute();
  }
}

class You {
  public static void main(String[] args) {
    Computer facade = new Computer();
    facade.startComputer();
  }
}

PHP

<?php

class AccountNumberCheck
{
  private $accountNumber = 12345678;

  public function getAccountNumber()
  {
    return $this->accountNumber;
  }

  public function accountActive($accountNumber)
  {
    return $accountNumber === $this->accountNumber;
  }
}

class SecurityCodeCheck
{
  private $securityCode = 1234;

  private function getSecurityCode()
  {
    return $this->securityCode;
  }

  private function isCodeCorrect($securityCode)
  {
    return $securityCode === $this->securityCode;
  }
}

class FundsCheck
{
  private $cashInAccount = 1000.00;

  public function getCashInAccount()
  {
    return $this->cashInAccount;
  }

  public function increaseCashInAccount($cashInWithdraw)
  {
    $this->cashInAccount += $cashInWithdraw;
  }

  public function decreaseCashInAccount($cashInWithdraw)
  {
    $this->cashInAccount -= $cashInWithdraw;
  }

  public function haveEnoughMoney($withdrawal)
  {
    if ($withdrawal > $this->getCashInAccount()) {
      echo 'Não há fundos suficientes<br />', PHP_EOL;
      echo 'Saldo atual: ', $this->getCashInAccount(), '<br />', PHP_EOL;
      return false;
    }

    $this->decreaseCashInAccount($withdrawal);
    echo 'O saldo atual é de: ', $this->getCashInAccount(), '<br />', PHP_EOL;
    return true;
  }

  public function makeDeposit($cashToDepoisit)
  {
    $this->increaseCashInAccount($cashToDepoisit);
    echo 'Depósito efetuado: o saldo atual é de: ', $this->getCashInAccount(), '<br />' . PHP_EOL;
  }
}

/*
 * Facade
 */
class BankAccountFacade
{
  private $accountNumber;
  private $securityCode;
  public $acctChecker;
  public $codeChecker;
  public $fundsChecker;
  public $bankWelcome;

  public function __construct($newAccNum, $newSecCode)
  {
    $this->accountNumber = $newAccNum;
    $this->securityCode = $newSecCode;

    $this->acctChecker = new AccountNumberCheck();
    $this->codeChecker = new SecurityCodeCheck();
    $this->fundsChecker = new FundsCheck();
  }

  public function getAccountNumber()
  {
    return $this->accountNumber;
  }

  public function getSecurityCode()
  {
    return $this->securityCode;
  }

  public function withdrawCash($cashToGet)
  {
    $isActive = $this->acctChecker->accountActive($this->getAccountNumber());
    $isCodeCorrect = $this->codeChecker->isCodeCorrect($this->getSecurityCode());
    $hasEnoughMoney = $this->fundsChecker->haveEnoughMoney($cashToGet);

    if ($isActive && $isCodeCorrect && $hasEnoughMoney) {
      echo 'Saque: transação efetuada<br />', PHP_EOL;
      return;
    }

    echo 'Saque: transação não realizada<br />' . PHP_EOL;
  }

  public function depositCash($cashToDeposit)
  {
    $isActive = $this->acctChecker->accountActive($this->getAccountNumber());
    $isCodeCorrect = $this->codeChecker->isCodeCorrect($this->getSecurityCode());

    if ($isActive && $isCodeCorrect) {
      $this->fundsChecker->makeDeposit($cashToDeposit);
      echo 'Depósito: transação concluída<br />' . PHP_EOL;
      return;
    }

    echo 'Depósito: transação não realizada<br />', PHP_EOL;
  }
}

$accessingBank = new BankAccountFacade(12345678, 1234);
$accessingBank->withdrawCash(200.00);
$accessingBank->depositCash(200.00);
$accessingBank->depositCash(1000.00);
$accessingBank->withdrawCash(350.00);

Ligações externas[editar | editar código-fonte]

Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.