Façade: diferenças entre revisões
Desfeita a edição 44214110 de Andrey Knupp Vital |
Etiqueta: Seção eliminada |
||
Linha 7: | Linha 7: | ||
Um ''façade'' é um padrão de projeto (''design pattern'') do tipo estrutural. Os ''façades'' são muito comuns em projeto [[orientação a objeto|orientados a objeto]]. Por exemplo, a biblioteca padrão da [[linguagem de programação Java|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 ''[[pixel]]s'' que formam este caractere. Entretanto, a maioria dos programadores Java não se preocupam com esses detalhes, pois a biblioteca contém as [[classe]]s do tipo ''façade'' (<code>Font</code> e <code>Graphics</code>) que oferecem métodos simples para as operações relacionadas com fontes. |
Um ''façade'' é um padrão de projeto (''design pattern'') do tipo estrutural. Os ''façades'' são muito comuns em projeto [[orientação a objeto|orientados a objeto]]. Por exemplo, a biblioteca padrão da [[linguagem de programação Java|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 ''[[pixel]]s'' que formam este caractere. Entretanto, a maioria dos programadores Java não se preocupam com esses detalhes, pois a biblioteca contém as [[classe]]s do tipo ''façade'' (<code>Font</code> e <code>Graphics</code>) que oferecem métodos simples para as operações relacionadas com fontes. |
||
== Estrutura == |
|||
[[Ficheiro: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 == |
== Exemplo == |
Revisão das 19h04min de 6 de maio de 2016
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.
Exemplo
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
- «Descrição do padrão façade». (em inglês)
- «Descrição do padrão façade». por Vince Huston (em inglês)
- «Descrição do padrão façade na linguagem Java». (em inglês)