Sei sulla pagina 1di 6

Skiptonavigation

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.

Potrebbero piacerti anche