07 padrões de projeto -...
TRANSCRIPT
PadrõesdeProjetodeSoftwareOO
• Tambémconhecidoscomo• PadrõesdeProjetodeSoftwareOO• ousimplesmentecomoPadrões
AInspiração
• Aidéia depadrõesfoiapresentadaporChristopherAlexanderem1977nocontextodeArquitetura(deprédiosecidades):• Cadapadrãodescreveumproblemaqueocorrerepetidamentedenovoedenovoemnossoambiente,eentãodescreveapartecentraldasolução paraaqueleproblemadeumaformaquevocêpodeusarestasoluçãoummilhãodevezes,semnuncaimplementa-laduasvezesdamesmaforma
• Livros• TheTimelessWayof Building• APattern Language:Towns,Buildings,and Construction• serviramdeinspiraçãoparaosdesenvolvedoresdesoftware
CatálogodeSoluções
• Umpadrãoencerraoconhecimentodeumapessoamuitoexperienteemumdeterminadoassuntodeumaformaqueesteconhecimentopodesertransmitidoparaoutraspessoasmenosexperientes•Outrasciências(p.ex.química)eengenhariaspossuemcatálogosdesoluções•Desde1995,odesenvolvimentodesoftwarepassouateroseuprimeirocatálogodesoluçõesparaprojetodesoftware:olivroGoF
GangofFour(GoF)
• E.Gamma and R.Helm andR.Johnson and J.Vlissides.DesignPatterns - Elements ofReusable Object-OrientedSoftware.Addison-Wesley,1995.
GangofFour(GoF)
•Passamosaterumvocabuláriocomumparaconversarsobreprojetosdesoftware
• Soluçõesquenãotinhamnomepassamaternome
•Aoinvésdediscutirmosumsistemaemtermosdepilhas,filas,árvoreselistasligadas,passamosafalardecoisasdemuitomaisaltonívelcomoFábricas,Fachadas,Observador,Estratégia,etc.
GangofFour(GoF)
•AmaioriadosautoreseramentusiastasdeSmalltalk,principalmenteoRalphJohnson
•MasacabarambaseandoolivroemC++paraqueoimpactojuntoàcomunidadedeCCfossemaior.Eoimpactofoienorme,olivrovendeucentenasdemilharesdecópias
OFormatodeumPadrão
• Todopadrãoinclui• Nome• Problema• Solução• Conseqüências /Forças
• ExistemoutrostiposdepadrõesmasnaauladehojevamosnosconcentrarnoGoF
OFormatodospadrõesnoGoF
• Nome (incluinúmerodapágina)• umbomnomeéessencialparaqueopadrãocaianabocadopovo
• Objetivo/Intenção• TambémConhecidoComo•Motivação• umcenáriomostrandooproblemaeanecessidadedasolução
• Aplicabilidade• comoreconhecerassituaçõesnasquaisopadrãoéaplicável
• Estrutura• umarepresentaçãográficadaestruturadeclassesdopadrão(usandoOMT91)em,àsvezes,diagramasdeinteração(Booch 94)
• Participantes• asclasseseobjetosqueparticipamequaissãosuasresponsabilidades
OFormatodospadrõesnoGoF
• Colaborações• comoosparticipantescolaboramparaexercerassuasresponsabilidades
• Conseqüências• vantagensedesvantagens,trade-offs
• Implementação• comquaisdetalhesdevemosnospreocuparquandoimplementamosopadrão
• aspectosespecíficosdecadalinguagem• ExemplodeCódigo
• nocasodoGoF,emC++(amaioria)ouSmalltalk• UsosConhecidos
• exemplosdesistemasreaisdedomíniosdiferentesondeopadrãoéutilizado• PadrõesRelacionados
• quaisoutrospadrõesdevemserusadosemconjuntocomesse• quaispadrõessãosimilaresaeste,quaissãoasdierenças
TiposdePadrõesdeProjeto
•CategoriasdePadrõesdoGoF1. PadrõesdeCriação2. PadrõesEstruturais3. PadrõesComportamentais
•Naauladehoje:• PadrãodeCriaçãodeobjetos:FábricaAbstrata(AbstractFactory)
FábricaAbstrata
•Objetivo:proverumainterfaceparacriaçãodefamíliasdeobjetosrelacionadossemespecificarsuaclasseconcreta
FábricaAbstrata– Motivação
•Considereumaaplicaçãocominterfacegráficaqueéimplementadaparaplataformasdiferentes(MotifparaUNIXeoutrosambientesparaWindowseMacOS)• Asclassesimplementandooselementosgráficosnãopodemserdefinidasestaticamentenocódigo• Precisamosdeumaimplementaçãodiferenteparacadaambiente• Atéemummesmoambiente,gostaríamosdedaraopçãoaousuáriodeimplementardiferentesaparências(look-and-feel)
FábricaAbstrata– Motivação
•Podemossolucionaroreferidoproblemadefinindoumaclasseabstrataparacadaelementográficoeutilizandodiferentesimplementaçõesparacadaaparênciaouparacadaambiente
•Aoinvésdecriarmosasclassesconcretascomooperadornew,utilizamosumaFábricaAbstrataparacriarosobjetosemtempodeexecução
•Ocódigoclientenãosabequalclasseconcretautilizamos
FábricaAbstrata– Aplicabilidade
•Useumafábricaabstrataquando:• umsistemadeveserindependentedaformacomoseusprodutossãocriadoserepresentados;• umsistemadevepoderlidarcomumafamíliadeváriosprodutosdiferentes;• vocêquerproverumabibliotecadeclassesdeprodutosmasnãoquerrevelarassuasimplementações,querrevelarapenassuasinterfaces.
Fábrica Abstrata – Estrutura
AbstractProductA
ProductA1
Client
ProductA2
AbstractFactory
CreatProductA()
CreatProductB()
ConcreteFactory2
CreatProductA()
CreatProductB()
ConcreteFactory1
CreatProductA()
CreatProductB()
AbstractProductB
ProductB1ProductB2
FábricaAbstrata– Participantes
• AbstractFactory (WidgetFactory)
• ConcreteFactory (MotifWidgetFactory,WindowsWidgetFactory)
• AbstractProduct (Window,ScrollBar)
• ConcreteProduct (MotifWindow,MotifScrollBar,WindowsWindow,WindowsScrollBar)
• Client - usaapenasasinterfacesdeclaradaspelaAbstractFactory epelasclassesAbstratProduct
FábricaAbstrata– Colaborações
•Normalmente,apenasumainstânciadeConcreteFactory écriadaemtempodeexecução.
• EstainstânciacriaobjetosatravésdasclassesConcreteProduct correspondentesaumafamíliadeprodutos
•UmaAbstractFactory deixaacriaçãodeobjetosparaassuassubclassesConcreteFactory
FábricaAbstrata– Conseqüências
•Opadrão1. isolaasclassesconcretasdosclientes;2. facilitaatrocadefamíliasdeprodutos(bastatrocar
umalinhadocódigopoisacriaçãodafábricaconcretaapareceemumúnicopontodoprograma);
3. promoveaconsistênciadeprodutos(nãoháoperigodemisturarobjetosdefamíliasdiferentes);
4. dificultaacriaçãodenovosprodutosligeiramentediferentes(poistemosquemodificarafábricaabstrataetodasasfábricasconcretas).
FábricaAbstrata– Implementação
• Nafábricaabstrata,cria-seummétodofábricaparacadatipodeproduto.Cadafábricaconcretaimplementaocódigoquecriaosobjetosdefato
• Setivermosmuitasfamíliasdeprodutos,teríamosumexcessodeclasses“fábricasconcretas”
• Pararesolveresteproblema,podemosusaroPrototype:criamosumdicionáriomapeandotiposdeprodutoseminstânciasprototípicasdestesprodutos
• Então,semprequeprecisarmoscriarumnovoprodutopedimosàsuainstânciaprototípicaquecrieumclone(usandoummétodocomoclone() ou copy()).
Fábrica Abstrata – Implementação
• EmlinguagensdinâmicascomoSmalltalk ondeclassessãoobjetosdeprimeiraclasse,nãoprecisamosguardarumainstânciaprototípica,guardamosumareferênciaparaaprópriaclasseedaíutilizamosométodonewparaconstruirasnovasinstâncias
• Definindofábricasextensíveis• normalmente,cadatipodeprodutotemoseuprópriométodofábrica;issotornaainclusãodenovosprodutosdifícil• solução:usarapenasummétodofábrica
• Product make (string thingToBeMade)• issoaumentaaflexibilidademastornaocódigomenosseguro(nãoteremosverificaçãodetipospelocompilador)
Fábrica Abstrata – ExemplosdeCódigo•OGoF contémexemplosemC++eSmalltalk
•NaspróximasaulasveremosexemplosemJava
Fábrica Abstrata – UsosConhecidos
• InterViews usafábricasabstratasparaencapsulardiferentestiposdeaparênciasparasuainterfacegráfica
• ET++usafábricasabstratasparapermitirafácilportabilidadeparadiferentesambientesdejanelas(XWindows eSunView,porexemplo)
Fábrica Abstrata – UsosConhecidos
• SistemadecapturaereproduçãodevídeofeitonaUIUCusafábricasabstratasparapermitirportabilidadeentrediferentesplacasdecapturadevídeo
• EmlinguagensdinâmicascomoSmalltalk (etalvezemPOOemgeral)classespodemservistascomofábricasdeobjetos
Fábrica Abstrata – PadrõesRelacionados• Fábricasabstratassãonormalmenteimplementadascommétodosfábrica(FactoryMethod)maspodemtambémserimplementadosusandoPrototype
•OusodeprotótiposéparticularmenteimportanteemlinguagensnãodinâmicascomoC++eemlinguagens"semi-dinâmicas"comoJava
Fábrica Abstrata – PadrõesRelacionados• EmSmalltalk,nãoétãorelevante• Curiosidade:alinguagemSelf nãopossuiclasses,todacriaçãodeobjetoséfeitaviaclonagem
•UmafábricaconcretaénormalmenteumSingleton
OsPadrõesGoF:Comportamentais
• Chainof Responsibility• Command• Interpreter• Iterator• Mediator• Memento
• Observer• State• Strategy• Template Method• Visitor
Recapitulando
•VoltandoaoChristopherAlexander:“Cadapadrãodescreveumproblemaqueocorrerepetidamentedenovoedenovoemnossoambiente,eentãodescreveapartecentraldasoluçãoparaaqueleproblemadeumaformaquevocêpodeusarestasoluçãoummilhãodevezes,semnuncaimplementa-laduasvezesdamesmaforma.”
• Talvezaúltimapartenãosejasempredesejável.