Introdução aos Padrões de Projeto
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 70 de 91.
Padrões de projeto são soluções comprovadas para problemas comuns que os desenvolvedores encontram repetidamente ao construir software. Em vez de reinventar a roda a cada vez, você pode aplicar esses modelos estabelecidos para resolver desafios semelhantes em seu próprio código.
Pense nos padrões de projeto como receitas. Assim como um chef segue uma receita para criar um prato que foi aperfeiçoado ao longo do tempo, os desenvolvedores usam padrões de projeto para estruturar seu código de maneiras que foram testadas e refinadas por inúmeros programadores antes deles.
Padrões de projeto são tipicamente agrupados em três categorias:
| Categoria | Propósito | Exemplos |
|---|---|---|
| Criacional | Como os objetos são criados | Singleton, Factory |
| Estrutural | Como os objetos são compostos | Adapter, Decorator |
| Comportamental | Como os objetos se comunicam | Observer, Strategy |
Você tem usado padrões ao longo deste curso sem perceber. Quando você criou classes abstratas com métodos que as classes filhas devem implementar, você estava aplicando uma forma do padrão Template Method. Quando você usou interfaces para definir contratos, você estava se preparando para o padrão Strategy.
Aprender padrões de projeto oferece um vocabulário compartilhado com outros desenvolvedores. Em vez de explicar uma estrutura complexa em detalhes, você pode simplesmente dizer "Eu usei o padrão Factory aqui" e desenvolvedores experientes entenderão imediatamente sua abordagem. Nas próximas lições, implementaremos vários padrões essenciais em PHP.
Desafio
FácilVamos construir um sistema simples de formatação de mensagens que demonstra como os padrões de projeto ajudam a organizar o código. Você identificará a qual categoria de padrão cada componente pertence e verá como diferentes partes de um sistema trabalham juntas.
Você organizará seu código em três arquivos:
MessageFormatter.php— Crie uma interface chamadaMessageFormatterque define um contrato para a formatação de mensagens. Ela deve ter um único métodoformat(string $message): string. Isso representa a categoria behavioral (comportamental) — ela define como os objetos se comunicam e processam dados.Formatters.php— Inclua o arquivo MessageFormatter e crie duas classes que implementam a interface:UppercaseFormatter— Seu métodoformat()retorna a mensagem convertida para letras maiúsculasBracketFormatter— Seu métodoformat()envolve a mensagem em colchetes como[message]
main.php— Inclua o arquivo Formatters. Você receberá duas entradas: uma string de mensagem e um tipo de formatador ("upper"ou"bracket").Crie uma função chamada
processMessageque aceita umMessageFormattere uma string de mensagem, e então retorna o resultado formatado. Esta função não precisa saber qual formatador específico ela recebe — ela apenas chamaformat()em qualquer objeto que for passado.Com base na entrada do tipo de formatador, crie o objeto formatador apropriado. Passe-o para sua função
processMessagejunto com a mensagem e imprima o resultado.Em uma nova linha, imprima qual categoria de padrão essa estrutura representa. Como estamos definindo comportamentos intercambiáveis por meio de uma interface, imprima:
Pattern category: Behavioral
Este desafio mostra como as interfaces permitem que você troque implementações sem alterar o código que as utiliza — uma base para padrões como Strategy que você explorará nas próximas lições.
Folha de consulta
Padrões de projeto são soluções comprovadas para problemas comuns de programação que fornecem modelos para estruturar o código de forma eficaz.
Os padrões de projeto são agrupados em três categorias:
| Categoria | Propósito | Exemplos |
|---|---|---|
| Criacional | Como os objetos são criados | Singleton, Factory |
| Estrutural | Como os objetos são compostos | Adapter, Decorator |
| Comportamental | Como os objetos se comunicam | Observer, Strategy |
Os padrões de projeto fornecem um vocabulário compartilhado entre os desenvolvedores, facilitando a comunicação de decisões arquitetônicas complexas.
Experimente você mesmo
<?php
require_once 'Formatters.php';
// Ler a entrada
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Criar uma função chamada processMessage que aceite um MessageFormatter
// e uma string de mensagem, e então retorne o resultado formatado
// TODO: Com base no $formatterType ("upper" ou "bracket"), criar o formatador apropriado
// TODO: Chamar processMessage com o formatador e a mensagem, e então imprimir o resultado
// TODO: Imprimir a categoria do padrão em uma nova linha
// Formato: "Pattern category: Behavioral"
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy