Este artigo ou secção contémuma lista de referências no fim do texto, mas as suas fontes não são claras porquenão sãocitadas no corpo do artigo, o quecompromete aconfiabilidade das informações. Ajude amelhorar este artigoinserindo citações no corpo do artigo.(Outubro de 2016) |
OPadrão de projeto Facade (ou Fachada) é umpadrão de design de software usado comumente com programação orientada a objetos. Este nome é uma analogia para uma fachada arquitetural. Um Facade é um objeto que provê uma interface simplificada para um corpo de código maior, como por exemplo, uma biblioteca de classes.
O Padrão Facade é do tipo estrutural . É usado quando um sistema é muito complexo ou difícil de entender, já que possui um grande número de classes independentes ou se trechos de código fonte estão indisponíveis. Este padrão esconde as complexidades de um sistema maior e provê uma interface simplificada ao cliente. Tipicamente envolve uma única classe responsável por englobar uma série de membros requeridos pelo cliente. Estes membros acessam o sistema em nome doFacade e escondem os detalhes de implementação.
Estruturar um sistema em subsistemas ajuda a reduzir sua complexidade. A dependência existente entre os subsistemas pode ser minimizada por meio do uso de um objeto Facade, que fornece uma interface única e uniforme para as diversas funcionalidades de um subsistema.
Quando o sistema é complexo e o cliente não precisa entendê-lo completamente, o Facade possibilita um uso simplificado desse sistema, apenas umsubconjunto dele, ou utilizá-lo de uma maneira particular. Dispomos então de um sistema complicado, do qual precisamos utilizar somente uma parte, para um sistema simplificado, customizado para nossas necessidades.
Tem como propósito promover uma interface unificada para um conjunto de interfaces de um subsistema. Dessa forma, é definida uma interface de alto nível que torna um subsistema mais fácil de ser utilizado.
Seu objetivo é implementar uma forma de interagir com um sistema que seja mais fácil do que a atual, com a intenção de usar um subconjunto do sistema em questão. Ou seja, busca simplificar o uso de um sistema existente a partir de uma interface própria definida.
Conhece quais classes dos subsistemas são responsáveis pela chamada.
Delega chamadas do cliente aos objetos de subsistemas corretos.
Implementa funcionalidades dos subsistemas.
Lida com o trabalho atribuído pelo objeto Facade.
Não tem conhecimento de Facade, isso o mantém sem referências com o cliente diretamente.
Conhece quais classes dos subsistemas são responsáveis pela chamada.
O PadrãoFacade pode ser usado quando :
Por exemplo um empréstimo em um sistema bancário:
Em um sistema bancário, o cliente precisa realizar diversas consultas a diversas entidades a fim de obter retorno sobre suas condições de realizar um empréstimo junto ao banco. Sem um padrãofacade, o cliente deveria ter acesso, e consequentemente conhecer toda a complexidade por trás das regras de concessão de empréstimo.
Com a aplicação do padrão de projeto, o Facade irá tomar para sí a responsabilidade de colher dados das diferentes classes responsáveis pela decisão sobre a possibilidade de concessão de empréstimo para o cliente, e ao final, entregar a ele apenas a informação pronta.
O padrãoAbstract Factory pode ser usado com oFacade para fornecer uma interface responsável por criar objetos em um subsistema de forma independente. Pode também ser usado como uma alternativa aoFacade para esconder classes de alguma plataforma especifica.
OMediator é muito semelhante aoFacade, pois abstrai a funcionalidade de classes preexistentes. No entanto, a propósito doMediator é abstrair comunicação arbitraria entre objetos relacionados, comumente centralizando funcionalidades que não correspondem a nenhum deles. Classes relacionadas aoMediator não só são cientes deste, como também se comunicam com ele diretamente ao invés de se comunicarem uma à outra.
Em contrapartida, oFacade meramente abstrai a interface para os objetos do subsistema para torna-los mais simples de serem usados. Nenhuma nova funcionalidade é definida e classes do subsistema não são cientes de sua presença.
Normalmente, apenas um objetoFacade é necessário. Portanto,Facades são constantemente associados ao padrãoSingleton.
Enquanto o flyweight nos mostra como instanciar muitos objetos de pequeno tamanho, o Facade nos mostra como fazer apenas um objeto representar um subsistema inteiro.
Esse é um exemplo abstrato de como um cliente ("você") interage com umFacade (o "computador") para um sistema complexo (as partes internas do computador como o processador e odisco rígido):
classCPU{publicvoidfreeze(){...}publicvoidjump(longposition){...}publicvoidexecute(){...}}classMemory{publicvoidload(longposition,byte[]data){...}}classHardDrive{publicbyte[]read(longlba,intsize){...}}classComputer{privateCPUcpu;privateMemorymemory;privateHardDrivehardDrive;publicComputer(){this.cpu=newCPU();this.memory=newMemory();this.hardDrive=newHardDrive();}publicvoidstartComputer(){cpu.freeze();memory.load(BOOT_ADDRESS,hardDrive.read(BOOT_SECTOR,SECTOR_SIZE));cpu.jump(BOOT_ADDRESS);cpu.execute();}}classYou{publicstaticvoidmain(String[]args){Computerfacade=newComputer();facade.startComputer();}}
<?phpclassAccountNumberCheck{private$accountNumber=12345678;publicfunctiongetAccountNumber(){return$this→accountNumber;}publicfunctionaccountActive($accountNumber){return$accountNumber===$this→accountNumber;}}classSecurityCodeCheck{private$securityCode=1234;privatefunctiongetSecurityCode(){return$this→securityCode;}privatefunctionisCodeCorrect($securityCode){return$securityCode===$this→securityCode;}}classFundsCheck{private$cashInAccount=1000.00;publicfunctiongetCashInAccount(){return$this→cashInAccount;}publicfunctionincreaseCashInAccount($cashInWithdraw){$this→cashInAccount+=$cashInWithdraw;}publicfunctiondecreaseCashInAccount($cashInWithdraw){$this→cashInAccount-=$cashInWithdraw;}publicfunctionhaveEnoughMoney($withdrawal){if($withdrawal>$this→getCashInAccount()){echo'Não há fundos suficientes<br />',PHP_EOL;echo'Saldo atual: ',$this→getCashInAccount(),'<br />',PHP_EOL;returnfalse;}$this→decreaseCashInAccount($withdrawal);echo'O saldo atual é de: ',$this→getCashInAccount(),'<br />',PHP_EOL;returntrue;}publicfunctionmakeDeposit($cashToDepoisit){$this→increaseCashInAccount($cashToDepoisit);echo'Depósito efetuado: o saldo atual é de: ',$this→getCashInAccount(),'<br />'.PHP_EOL;}}/**Facade*/classBankAccountFacade{private$accountNumber;private$securityCode;public$acctChecker;public$codeChecker;public$fundsChecker;public$bankWelcome;publicfunction__construct($newAccNum,$newSecCode){$this→accountNumber=$newAccNum;$this→securityCode=$newSecCode;$this→acctChecker=newAccountNumberCheck();$this→codeChecker=newSecurityCodeCheck();$this→fundsChecker=newFundsCheck();}publicfunctiongetAccountNumber(){return$this→accountNumber;}publicfunctiongetSecurityCode(){return$this→securityCode;}publicfunctionwithdrawCash($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;}publicfunctiondepositCash($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=newBankAccountFacade(12345678,1234);$accessingBank→withdrawCash(200.00);$accessingBank→depositCash(200.00);$accessingBank→depositCash(1000.00);$accessingBank→withdrawCash(350.00);
![]() | Este artigo sobreprogramação de computadores é umesboço. Você pode ajudar a Wikipédiaexpandindo-o. |