Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MarcosBrizeno
DesenvolvimentodeSoftware#showmethecode
novembro17,2011
Monamassa:Facade
Problema:
NodesenvolvimentodejogoscomumautilizaodesubsistemasdeumFramework/API.
Porexemplo,parareproduzirumdeterminadosomutilizadoosubsistemadeAudio,que
normalmenteprovfuncionalidadesdesdeaconfiguraodareproduodeaudio,ata
reproduodeumdeterminadoarquivo.
Antesdeiniciarojogodefatonecessriorealizarajustesemtodosossubsistemasquesero
utilizados,porexemplo,necessrioconfigurararesoluodosubsistemadeVideoparaque
estepossarenderizarimagenscorretamente.
Paraexemplificarvejaasinterfacesdaseguintesclasses,querepresentaosubsistemadeAudio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
publicclassSistemaDeAudio{
publicvoidconfigurarFrequencia(){
System.out.println("Frequenciaconfigurada");
}
publicvoidconfigurarVolume(){
System.out.println("Volumeconfigurado");
}
publicvoidconfigurarCanais(){
System.out.println("Canaisconfigurados");
}
publicvoidreproduzirAudio(Stringarquivo){
System.out.println("Reproduzindo:"+arquivo);
17
17
18
}
}
Comofaladoelaforneceosmtodosparaconfiguraoereproduodearquivosdeaudio.
Parareproduzirumarquivodeaudio,porexemplo,serianecessriorealizarasseguintes
operaes:
1
2
3
4
5
6
7
8
9
10
publicstaticvoidmain(String[]args){
System.out.println("#####Configurandosubsistemas#####");
SistemaDeAudioaudio=newSistemaDeAudio();
audio.configurarCanais();
audio.configurarFrequencia();
audio.configurarVolume();
System.out.println("#####Utilizandosubsistemas#####");
audio.reproduzirAudio("teste.mp3");
}
Nesteexemplodecdigocliente,oprprioclientedeveinstanciareconfigurarosubsistema
paraquesdepoissejapossvelautilizaodosmesmos.Almdisso,existeum
comportamentopadroqueexecutadoantesdereproduzirumsom:sempredeveser
configuradoocanal,afrequnciaeovolume.
Agorapensecomoseriacasofossenecessrioutilizarvriossubsistemas?Ocdigocliente
ficariamuitosobrecarregadocomresponsabilidadesquenosodele:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
publicstaticvoidmain(String[]args){
System.out.println("#####Configurandosubsistemas#####");
SistemaDeAudioaudio=newSistemaDeAudio();
audio.configurarCanais();
audio.configurarFrequencia();
audio.configurarVolume();
SistemaDeInputinput=newSistemaDeInput();
input.configurarTeclado();
input.configurarJoystick();
SistemaDeVideovideo=newSistemaDeVideo();
video.configurarCores();
video.configurarResolucao();
System.out.println("#####Utilizandosubsistemas#####");
audio.reproduzirAudio("teste.mp3");
input.lerInput();
video.renderizarImagem("imagem.png");
}
VamosverentocomoopadroFacadepoderesolverestepequenoproblema.
Facade
Aintenodopadro:
Aintenodopadro:
Fornecerumainterfaceunificadaparaumconjuntodeinterfacesemumsubsistema.Facade
defineumainterfacedenvelmaisaltoquetornaosubsistemamaisfcildeserusado.[1]
Pelaintenopossvelnotarqueopadropodeajudarbastantenaresoluodonosso
problema.Oconjuntodeinterfacesseriaexatamenteoconjuntodesubsistemas.Comofalado
em[1]umsubsistemaanlogoaumaclasse,umaclasseencapsulaestadoseoperaes,
enquantoumsubsistemaencapsulaclasses.
NessesentidooFacadevaidefiniroperaesaseremrealizadascomestessubsistemas.Assim,
possveldefinirumaoperaopadroparaconfigurarosubsistemadeaudio,evitandoa
necessidadedechamarosmtodosdeconfiguraodeaudioacadanovoarquivodeaudio
quepreciseserreproduzido.
AutilizaodopadroFacadebemsimples.apenasnecessriocriaraclassefachadaqueir
secomunicarcomossubsistemasnolugarnocliente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
publicclassSistemasFacade{
protectedSistemaDeAudioaudio;
protectedSistemaDeInputinput;
protectedSistemaDeVideovideo;
publicvoidinicializarSubsistemas(){
video=newSistemaDeVideo();
video.configurarCores();
video.configurarResolucao();
input=newSistemaDeInput();
input.configurarJoystick();
input.configurarTeclado();
audio=newSistemaDeAudio();
audio.configurarCanais();
audio.configurarFrequencia();
audio.configurarVolume();
}
publicvoidreproduzirAudio(Stringarquivo){
audio.reproduzirAudio(arquivo);
}
publicvoidrenderizarImagem(Stringimagem){
video.renderizarImagem(imagem);
}
publicvoidlerInput(){
input.lerInput();
}
Aclassefachadarealizaainicializaodetodosossubsistemaseofereceacessoaosmtodos
necessrios,porexemploomtododerenderizaodeumaimagem,areproduodeum
audio.
Comestamudana,tiramostodaaresponsabilidadedocliente,queagoraprecisasepreocupar
Comestamudana,tiramostodaaresponsabilidadedocliente,queagoraprecisasepreocupar
apenasemutilizarossubsistemasquedesejar.
1
2
3
4
5
6
7
8
9
10
publicstaticvoidmain(String[]args){
System.out.println("#####Configurandosubsistemas#####");
SistemasFacadefachada=newSistemasFacade();
fachada.inicializarSubsistemas();
System.out.println("#####Utilizandosubsistemas#####");
fachada.renderizarImagem("imagem.png");
fachada.reproduzirAudio("teste.mp3");
fachada.lerInput();
}
Autilizaodopadrobemsimplesepoderseraplicadoemvriassituaes.
Umpoucodeteoria
Aideiabsicadopadro,comovisto,removeracomplexidadedasclassesclientes.
Visualmentefalando,elefazoseguinte:
(http://powerdream5.files.wordpress.com/2007/10/10_21_1_2007.jpg)
Notequeasclassesdosubsistemacontinuamsendovisveisemtodooprojeto.Portanto,caso
sejanecessrio,oclientepodedefinirsuasconfiguraessemsequerutilizaraclassefachada.
Aindamais,oclientepodecriarumafachadaprpria,quedefinesuasoperaescustomizadas.
Porexemplo,senoseroutilizadosjoysticksnoprojeto,nohnecessidadedeinicializlos.
Oproblemacomessacentralizaodacomplexidadequeaclassefachadapodecrescer
descontroladamenteparaabrigarumaconjuntograndedepossibilidades.Nestescasospode
sermaisvivelprocuraroutrospadres,comoAbstractFactory(http://wp.me/p1Mek81h)
paradividirasresponsabilidadesentresubclasses.
Existemalgumassemelhanas,fceisdeseremnotadas,destepadrocomoutrosjdiscutidos
aqui.Porexemplo,jqueoFacadedefineumainterface,qualasuadiferenaemrelaoao
padroAdapter(http://wp.me/p1Mek82z),jqueambosdefinemumanovainterface?A
diferenabsicaqueoAdapteradaptaumainterfaceantigaparaumaoutrainterface
diferenabsicaqueoAdapteradaptaumainterfaceantigaparaumaoutrainterface
enquantoqueoFacadecriaumainterfacecompletamentenova,quemaissimples.
OutrasemelhanaquetambmpodesernotadacomopadroMediator
(http://wp.me/p1Mek83l),jqueambosreduzemacomplexidadeentreumgrandeconjunto
deobjetos.AdiferenaquecomoopadroMediatorcentralizaacomunicaoentreos
objetoscolegas,normalmenteadicionandonovasfuncionalidadesesendoreferenciadopor
todososcolegas.NopadroFacade,aclassefachadaapenasutilizaossubsistemas,sem
adicionarnada,almdissoasclassesdosubsistemanosabemnadasobreafachada.
Cdigofontecompleto
OcdigocompletopodeserbaixadonoseguinterepositrioGit:
https://github.com/MarcosX/PadresdeProjeto(https://github.com/MarcosX/Padresde
Projeto).
Osarquivosestocomoumprojetodoeclipse,entobastacolocarnoseuWorkspaceefazero
import.
Segostoudopostcompartilhecomseusamigosecolegas,seno,comenteoquepodeser
melhorado.Encontroualgumerronocdigo?Comentetambm.Possuialgumaoutraopinio
oualgumainformaoadicional?Comentaai!
Referncias:
[1]GAMMA,Erichetal.PadresdeProjeto:Soluesreutilizveisdesoftwareorientadoa
objetos.
Sobre estes anncios (https://wordpress.com/about-these-ads/)
Facade
Facade,Java,Padres,Projeto
1comentrio
UmcomentriosobreMonamassa:Facade
1.
maio11,2015s5:44PM
AllyssonMouraLuz
Muitobomgosteidoartigo.Simplesefundamentado.
Responder
BlognoWordPress.com.|OtemaHighwind.