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).

/* Complex parts */
 
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) { ... }
}
 
/* Facade */
 
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();
    }
}
 
/* Client */
 
class You {
    public static void main(String[] args) {
        Computer facade = new Computer();
 facade.startComputer();
    }
}

PHP

<?php
 
class WelcomeToBank{
	function __construct(){
			print("Welcome to ABC Bank<br />" . PHP_EOL);
			print("We are happy to give you your money<br />" . PHP_EOL);
	}
 
}
 
class AccountNumberCheck{
	public $_accontnumber = 12345678;
 
	public function getAccountNumber(){ return $this->_accontnumber; }
 
	public function accountActive($intAccNumToCheck){
			if($intAccNumToCheck === $this->getAccountNumber()){
					return true;
			}else{
					return false;
			}
	}
}
 
class SecurityCodeCheck{
	public $_securityCode = 1234;
 
	public function getSecurityCode(){ return $this->_securityCode; }
 
	public function isCodeCorrect($intSecCodeToCheck){
			if($intSecCodeToCheck === $this->getSecurityCode()){
					return true;
			}else{
					return false;
			}
	}
}
 
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($cashToWithdrawal){
			if($cashToWithdrawal > $this->getCashInAccount())
			{
					print("Error: You don´t have enough money<br />" . PHP_EOL);
					print("Current Balance: ".$this->getCashInAccount()."<br />" . PHP_EOL);
					return false;
			}else
			{
					$this->decreaseCashInAccount($cashToWithdrawal);
					print("WithDraw Complete: Current Balance is ".$this->getCashInAccount()."<br />" . PHP_EOL);
					return true;
			}
	}
 
 
	public function makeDeposit($cashToDepoisit){
			$this->increaseCashInAccount($cashToDepoisit);
			print("Deposit Complete: Current Balance is ".$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();
			$this->bankWelcome = new WelcomeToBank();
 
	}
 
	public function getAccountNumber(){
			return $this->accountNumber;
	}
 
	public function getSecurityCode(){
			return $this->securityCode;
	}
 
	public function withdrawCash($cashToGet){
 
			if($this->acctChecker->accountActive($this->getAccountNumber()) && 
							$this->codeChecker->isCodeCorrect($this->getSecurityCode()) && 
									$this->fundsChecker->haveEnoughMoney($cashToGet)){
							print("Withdraw Cash: Transaction Complete<br />" . PHP_EOL);
 
			}else{
					print("Withdraw Cash: Transaction Failed<br />" . PHP_EOL);
			}
	}
 
 
	public function depositCash($cashToDeposit){
			if($this->acctChecker->accountActive($this->getAccountNumber()) && 
							$this->codeChecker->isCodeCorrect($this->getSecurityCode())){
 
					$this->fundsChecker->makeDeposit($cashToDeposit);
					print("Deposit Cash: Transaction Complete<br />" . PHP_EOL);
 
			}else{
					print("Deposit Cash: Transaction Failed<br />" . PHP_EOL);
			}       
	}
 
}
 
/*
* Tester Class
*/
class TestBackAccount{
 
 
	public static function  main(){
		$accessingBank = new BankAccountFacade(12345678, 1234);
		$accessingBank->withdrawCash(200.00);
		$accessingBank->depositCash(200.00);
		$accessingBank->depositCash(1000.00);
		$accessingBank->withdrawCash(350.00);
	}
}
 
/*
* Test Execute
*/
TestBackAccount::main();

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.