JÁ SABEMOS COMO É A REPRESENTAÇÃO DA INFORMAÇÃO
MAS AINDA NÃO SABEMOS COMO GERAR UM ESTRUTURA PARTICULAR DE LINHAS, COLUNAS E OBJETOS SIMPLES PARA UM DOCUMENTO PARTICULAR
ISSO É RESULTADO DA FORMATAÇÃO DO DOCUMENTO
PARA SIMPLIFICAR, FORMATAÇÃO SIGNIFICA APENAS QUEBRA EM LINHAS
O RESTO DA FORMATAÇÃO PODE SER TRATADO DE FORMA ANÁLOGA
AUTOMATIZAR A FORMATAÇÃO NÃO É SIMPLES
HÁ UM TRADE-OFF ENTRE VELOCIDADE DE FORMATAÇÃO E A QUALIDADE RESULTANTE
MUITAS COISAS DEVEM SER CONSIDERADAS TAIS COMO A "COR" DE UM DOCUMENTO (O ESPALHAMENTO UNIFORME DE ESPAÇOS EM BRANCO)
MUITOS ALGORITMOS TÊM SIDO PROPOSTOS E PODEM SER USADOS NO EDITOR
O ALGORITMO PODE ATÉ MUDAR EM TEMPO DE EXECUÇÃO
CONSIDERE A FORMATAÇÃO EM WORD COM "LAYOUT NORMAL" (SIMPLES) E "LAYOUT DA PÁGINA" (MAIS DEMORADO MAS MAIS WYSIWYG)
PONTO IMPORTANTE: QUEREMOS MANTER O ALGORITMO DE FORMATAÇÃO ISOLADO DA ESTRUTURA DO DOCUMENTO
PODEMOS ADICIONAR ELEMENTOS GRÁFICOS SEM AFETAR O ALGORITMO DE FORMATAÇÃO
PODEMOS MUDAR O ALGORITMO DE FORMATAÇÃO SEM AFETAR O TRATAMENTO DE ELEMENTOS DE DOCUMENTO
ISOLAREMOS O ALGORITMO DE FORMATAÇÃO ATRAVÉS DE SUA ENCAPSULAÇÃO NUM OBJETO
USAREMOS UMA HIERARQUIA DE CLASSES PARA OBJETOS QUE ENCAPSULAM ALGORITMOS DE FORMATAÇÃO
A RAIZ DA HIERARQUIA SERÁ UMA CLASSE COM INTERFACE SUFICIENTEMENTE GENÉRICA PARA SUPORTAR UMA LARGA GAMA DE ALGORITMOS
CADA SUBCLASSE IMPLEMENTA A INTERFACE PARA UM ALGORITMO PARTICULAR
AS CLASSES Formatador E ElementosAFormatar
A CLASSE Formatador É USADA PARA OBJETOS QUE ENCAPSULAM UM ALGORITMO DE FORMATAÇÃO
AS SUBCLASSES DE Formatador IMPLEMENTAM ALGORITMOS DE FORMATAÇÃO ESPECÍFICOS
OS ELEMENTOS A FORMATAR SÃO FILHOS DE UMA SUBCLASSE ESPECIAL DE ElementoDeDocumento (ElementosAFormatar)
QUANDO UM OBJETO ElementosAFormatar É CRIADO, ELE CRIA UMA INSTÂNCIA DE UMA SUBCLASSE DE Formatador, ESPECIALIZADA EM FORMATAR DE ALGUMA FORMA
O OBJETO ElementosAFormatar PEDE AO Formatador PARA FORMATAR SEUS ELEMENTOS QUANDO NECESSÁRIO
POR EXEMPLO, QUANDO HÁ UMA MUDANÇA AO DOCUMENTO
VER A ESTRUTURA DE CLASSES ABAIXO
UM OBJETO ElementosAFormatar NÃO FORMATADO CONTÉM APENAS OS ELEMENTOS BÁSICOS VISÍVEIS (SEM COMPOSITES LINHA, COLUNA, ETC.)
QUANDO OS ElementosAFormatar PRECISAM DE FORMATAÇÃO, O OBJETO CHAMA O FORMATADOR
O FORMATADOR VARRE OS FILHOS DE ElementosAFormatar E INSERE OS ELEMENTOS LINHA, COLUNA, ETC. DE ACORDO COM O ALGORITMO DE FORMATAÇÃO
VER RESULTADO DOS OBJETOS ABAIXO
FORMATADORES DIFERENTES IMPLEMENTAM ALGORITMOS DIFERENTES
FormatadorSimples É O MAIS SIMPLES E RÁPIDO (NÃO TRATA DE "COR") E TRATA APENAS UMA LINHA DE CADA VEZ
FormatadorTeX É MAIS COMPLEXO POIS CONSIDERA O PARÁGRAFO INTEIRO PARA DISTRIBUIR OS ESPAÇOS EM BRANCO
FormatadorArray COLOCA UM NÚMERO IGUAL DE ELEMENTOS EM CADA LINHA (PARA ALINHAR IMAGENS, POR EXEMPLO)
RESULTADO: A SEPARAÇÃO Formatador-ElementosAFormatar ASSEGURA UMA SEPARAÇÃO FORTE ENTRE O CÓDIGO QUE SUPORTA A ESTRUTURA DO DOCUMENTO E O CÓDIGO DE FORMATAÇÃO
PODEMOS ADICIONAR NOVOS FORMATADORES SEM TOCAR NAS CLASSES DE ELEMENTOS E VICE-VERSA
PODEMOS ATÉ MUDAR DE FORMATADOR EM TEMPO DE EXECUÇÃO COM UMA FUNÇÃO setFormatador NA CLASSE ElementosAFormatar
O PADRÃO QUE USAMOS CHAMA-SE "STRATEGY"
O PADRÃO "STRATEGY"
OBJETIVO
DEFINIR UMA FAMÍLIA DE ALGORITMOS, ENCAPSULAR CADA UM, E TORNÁ-LOS INTERCAMBIÁVEIS
STRATEGY PERMITE MUDAR OS ALGORITMOS INDEPENDENTEMENTE DOS CLIENTES QUE OS USAM
TAMBÉM CHAMADO DE "POLICY"
QUANDO USAR O PADRÃO STRATEGY?
VÁRIAS CLASSES RELACIONADAS TÊM APENAS COMPORTAMENTO DIFERENTE
VOCÊ PRECISA DE VARIANTES DE UM ALGORITMO
EXEMPLO: COM TRADE-OFFS DIFERENTES DE ESPAÇO-TEMPO
PARA ESCONDER DOS CLIENTES OS DADOS COMPLEXOS QUE UM ALGORITMO USA
UMA CLASSE TEM VÁRIOS COMPORTAMENTOS ESCOLHIDOS COM MUITAS DECISÕES
EM VEZ DE USAR DECISÕES, MOVA OS TRECHOS APROPRIADOS PARA SUA PRÓPRIA CLASSE STRATEGY
ESTRUTURA GENÉRICA
EXERCÍCIO PARA CASA: REDESENHE O DIAGRAMA DE CLASSES USANDO INTERFACES
PARTICIPANTES
Estratégia (EXEMPLO: Formatador)
DECLARA A INTERFACE COMUM A TODOS OS ALGORITMOS
O Contexto USA ESSA INTERFACE PARA CHAMAR O ALGORITMO DEFINIDO EM EstratégiaConcreta
EstratégiaConcreta (EXEMPLO: FormatadorSimples)
IMPLEMENTA O ALGORITMO USANDO A INTERFACE DE Estratégia
Contexto (EXEMPLO: ElementosAFormatar)
É CONFIGURADO COM UM OBJETO EstratégiaConcreta
MANTÉM UMA REFERÊNCIA PARA UM OBJETO Estratégia
PODE DEFINIR UMA INTERFACE PARA QUE A Estratégia ACESSE SEUS DADOS
COLABORAÇÕES ENTRE OBJETOS
O Contexto PODE CHAMAR A Estratégia PASSANDO A SI MESMO PARA QUE A Estratégia ACESSE OS DADOS
O Contexto ENCAMINHA PEDIDOS DOS SEUS CLIENTES PARA A Estratégia
CLIENTES NORMALMENTE CRIAM UMA EstratégiaConcreta E A PASSA PARA O Contexto
A PARTIR DAÍ, OS CLIENTES INTERAGEM APENAS COM O Contexto
CONSEQUÊNCIAS DO USO DO PADRÃO STRATEGY
UMA ALTERNATIVA À HERANÇA
PODER-SE-IA USAR HERANÇA (SUBCLASSES DE Contexto) PARA FAZER A MESMA COISA
MAU EXEMPLO DO USO DE HERANÇA
ACOPLA O Contexto COM OS ALGORITMOS (PARAFUSA O COMPORTAMENTO NO Contexto)
DEIXA O Contexto MAIS DIFÍCIL DE ENTENDER, MANTER E ESTENDER
O ALGORITMO NÃO PODERIA VARIAR DINAMICAMENTE
EXEMPLO CLÁSSICO DE HERANÇA VERSUS COMPOSIÇÃO
ESTRATÉGIAS ELIMINAM STATEMENTS CONDICIONAIS
QUANDO VÁRIOS COMPORTAMENTOS ESTÃO AGRUPADOS NA MESMA CLASSE
CÓDIGO QUE TEM MUITAS CONDIÇÕES ASSIM É CANDIDATO PARA O PADRÃO STRATEGY
PONTO NEGATIVO: CLIENTES DEVEM CONHECER AS ESTRATÉGIAS ANTES DE ESCOLHER UMA
ISSO EXPÕE OS CLIENTES A CONSIDERAÇÕES DE IMPLEMENTAÇÃO
SÓ USA A ESTRATÉGIA QUANDO A DIFERENÇA DE COMPORTAMENTO FOR RELEVANTE AOS CLIENTES
PONTO NEGATIVO: MAIS OBJETOS NO PROJETO
O PADRÃO FLYWEIGHT MOSTRA COMO LIDAR COM ISSO