Design Patterns em .NET: Composite e Chain of Responsibility
Neste artigo, veremos dois dos 23 padrões definidos no livro “Design Patterns Elements of Reusable Object-Oriented Software”: o padrão Composite e o padrão Chain of Responsibility. Explicaremos como eles podem ser utilizados visando melhorar a forma com que nossas aplicações são desenvolvidas.
Artigos.NETDesign Patterns em .NET: Composite e Chain of Responsibility
Do
que trata o artigo
Neste artigo, veremos
dois dos 23 padrões definidos no livro “Design Patterns Elements of Reusable
Object-Oriented Software”: o padrão Composite e o padrão Chain of
Responsibility. Explicaremos como eles podem ser utilizados visando melhorar a
forma com que nossas aplicações são desenvolvidas.
Para
que serve
Reuso de soluções e
documentações bem conhecidas fazem parte da principal meta em se utilizar
design patterns. Neste artigo, teremos foco em padrões que nos ajudem a
desenhar nossas aplicações de forma que sejam mais fáceis de manter e permitir
extensão.
Em
que situação o tema é útil
Composite pode ser
utilizado para se ter uma forma única de tratar diferentes objetos, sendo que
eles podem ser primitivos ou compostos. Já o Chain of Responsibility define uma
cadeia onde uma requisição é trafegada, permitindo que ela seja analisada e
processada pelo respectivo elemento responsável.
Resumo do DevMan
O artigo
foca na apresentação e demonstração de uso dos padrões Composite e Chain of
Responsibility, definidos pelo GoF (“Gang of Four”). Serão mostrados os seus
conceitos e aplicações, além de três exemplos de código simples, porém práticos,
para auxiliar o leitor no entendimento.
A importância em se ter padrões
O que seria dos desenvolvedores .NET se não
pudessem reutilizar componentes desse framework nas aplicações? Se, para
mostrar uma mensagem na tela, não fosse possível contar com uma classe como
System.Windows.Forms.MessageBox, e fosse necessário recriar o código que o faça
em cada novo sistema? Teríamos que ter, no mínimo, muitas horas para gastar. De
uma maneira similar, o que seria de nós se não tivéssemos padrões a serem
seguidos? Se para cada nova aplicação, tivéssemos que repensar qual a estrutura
a ser usada na hora de programar para deixar o código mais fácil de entender,
modificar e estender? É neste momento que design patterns fazem sentido, pois
eles provêm soluções estruturadas e bem testadas na vida real, com uma
documentação de domínio público. Com isso, poupamos nosso esforço em muitas
atividades, permitindo que nosso tempo seja mais bem utilizado dentro dos
nossos projetos (que convenhamos, eles sempre têm uma expectativa de entrega do
cliente menor que o prazo que gostaríamos de ter).
Muitos padrões de programação foram catalogados
no livro “Design Patterns: Elements of Reusable Object-Oriented Software”,
escrito por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides (“Gang of
Four”), lançado em 1995. São dessa obra que foram retirados os padrões que aqui
serão apresentados, mas ela não é a única fonte desse tipo de informação. “Patterns of Enterprise Application
Architecture” de Martin Fowler e “Applying UML and Patterns - An Introduction
to Object-Oriented Analysis and Design and Iterative Development” de Craig
Larman são outras obras que abordam o assunto.
Conceitualizando
o padrão Composite
Podemos dizer que o Composite é um padrão
“justo”, pois o seu objetivo é tratar diferentes objetos da mesma maneira,
sejam eles classes distintas ou mesmo agrupamentos desses próprios objetos,
desde que estejam organizados em uma estrutura de árvore (hierárquica).
Imagine um sistema de folha de pagamento, onde
é necessário calcular aumento de salários para os funcionários de uma empresa.
Podemos ter um aumento de salário para uma única pessoa, ou um aumento de
salário para toda uma categoria. Note que neste caso cada funcionário
representaria um objeto individual, e a categoria representaria um agrupamento,
uma composição desses objetos individuais.
Outro exemplo que podemos dar, e que será
utilizado na demonstração de código para este pattern, é uma estrutura de
diretórios e arquivos. Esta é a situação que está descrita na Figura 1 onde podemos ver os
relacionamentos entre os objetos. Cada arquivo é um objeto individual, e cada
diretório é uma composição de arquivos e até mesmo outros diretórios.
Figura 1. Estrutura em árvore - diretórios e arquivos
Mas até aqui não comentamos uma das principais
características deste padrão: estes elementos devem ser acessados de uma mesma
forma, tanto faz se é um objeto individual ou se é uma composição. Para chegar
neste objetivo, todos eles devem compartilhar uma mesma interface ou herdar de
uma mesma classe abstrata, de forma que todos possuam os mesmos métodos. Ainda
no exemplo de uma hierarquia de pastas e arquivos, cada objeto pode ter um
método para retornar o espaço em disco que ele ocupa. É claro que a
implementação desse método será diferente entre objetos que representam um
diretório e os que representam arquivos. Como um diretório em si não ocupa
espaço em disco, este método de cálculo pode ser feito a partir do resultado da
chamada deste mesmo método executada em cada arquivo contido na pasta.
Vejamos a Figura
2, que é a representação deste padrão. Temos uma classe abstrata comum,
Component. Note que o Composite possui, como atributo, uma lista de objetos do
tipo Component. Desta forma é que podemos manter a estrutura hierárquica
contida neste pattern. Além disso, o cliente acessa apenas a classe abstrata /
interface Component, para que todos os objetos possam ser tratados de forma
uniforme.
Outra questão importante é que a classe
Composite redireciona as chamadas das operações definidas na interface / classe
abstrata que ela recebe para seus filhos. Isso significa que, ao se chamar o
método Operation de Composite, serão chamados também os mesmos métodos
Operation de todos os filhos que a instância dessa classe possuir.
Figura 2. Definição dopattern Composite
Em resumo:
•
Component – é uma classe
abstrata ou interface que declara os métodos comuns que serão utilizados pelo
cliente para acessar os objetos de uma maneira uniforme;
•
Leaf – dentro da estrutura em
árvore que é criada por este padrão, esta classe representa uma “folha”, ou
seja, um objeto individual que não possui filhos dentro da hierarquia;
•
Composite – é o objeto que
agrupa os demais objetos que realizam a classe / interface, e que propaga a
execução das suas operações para as respectivas operações dos seus filhos. Antes
e após essa propagação de métodos, é permitido que sejam efetuados outros
processamentos adicionais.
Recuperando espaço consumido – exemplo
Nosso exemplo para demonstrar o padrão
Composite será uma aplicação que retorna a quantidade de espaço em disco
consumido pelos arquivos que estão guardados em um diretório do Windows. Note
que esse cálculo não deve apenas considerar o tamanho dos arquivos que estão
diretamente dentro da pasta, mas também o tamanho dos arquivos que estão dentro
de suas subpastas e assim por diante.
O primeiro código que temos é a Listagem 1, que mostra a interface que
define todas as operações que serão utilizadas para manipular, de modo único,
as classes que representam diretórios e arquivos.
Listagem 1. Interface IRecurso
using System;
namespace Composite
{
public interface IRecurso
{
string Caminho { get; set; }
long ObterTamanho();
}
}
Esta interface possui duas operações. Uma é a
propriedade Caminho, que será utilizada para armazenar o caminho do diretório
ou pasta (exemplo: C:\temp\ ou C:\temp\arquivo.txt). O outro método, ObterTamanho,
será responsável por retornar o tamanho em bytes que é ocupado no disco, seja
por um arquivo ou por um diretório inteiro.
Note que neste exemplo eu não estou utilizando
uma classe abstrata, mas sim uma interface. É uma preferência pessoal, pois
poderíamos utilizar a classe abstrata da maneira que está descrito no modelo de
classes que vimos na Figura 2.
Inclusive, se trabalharmos com essa herança, nós ganhamos a possibilidade de
definir comportamentos padrão para os métodos, ou seja, só precisaríamos
efetuar a sobrecarga dos métodos que realmente nos interessam. Mas como disse,
a utilização de uma interface é uma preferência minha.
Desta vez, nesta demonstração, eu quero mudar
um pouco a ordem como apresento cada pedaço do código de exemplo, colocando o
trecho final agora no meio da explicação. Com isso, eu quero mostrar que o
cliente faz acesso aos métodos definidos na interface de modo que para ele
tanto faz se estamos lidando com um objeto que representa um diretório ou um
arquivo.
Oferta válida para todos os planos durante o mês de dezembro
+3 MESES
Grátis
Veja os resultado dos nossos alunos
Conquistas reais de quem está aplicando o método
<Perguntas frequentes>
Carreira
Por onde devo iniciar os estudos?
Recomendamos começar pelo Plano de Estudo Carreira Programador Front-End. Essa área da programação é mais visual e intuitiva, tornando-a ideal para iniciantes. No Front-End, você aprenderá a criar a parte visual dos sites, como layout, cores e interatividade. Depois de dominar o Front-End, você pode avançar para Programador Back-End, onde aprenderá a lidar com a lógica e o funcionamento interno dos sites, e, finalmente, para Programador Mobile, focando no desenvolvimento de aplicativos para smartphones. Nossa metodologia é estruturada de forma progressiva para garantir que você desenvolva confiança e experiência ao criar projetos reais, como sites estáticos e dinâmicos.
Em quanto tempo vou me tornar um programador?
O tempo necessário para se tornar um programador varia de acordo com a dedicação de cada estudante. Com nossa metodologia, que inclui um Plano de Estudo detalhado e suporte contínuo, você pode se tornar um programador de 6 meses a um ano, dependendo do seu ritmo e esforço. Nossa abordagem prática e orientada a projetos ajudará a acelerar seu aprendizado.
Eu preciso de um diploma de faculdade para começar a atuar como programador?
Não. Ser programador é uma excelente oportunidade para quem não possui diploma de faculdade. Muitas empresas contratam baseadas nas habilidades técnicas e experiência prática, não necessariamente em diplomas. Após conquistar uma vaga, você pode optar por complementar sua formação com um diploma.
Por que a programação se tornou a profissão mais promissora da atualidade?
A necessidade de programadores cresceu exponencialmente, especialmente após a pandemia de Covid-19, que forçou muitas empresas a se adaptarem ao digital. Com o crescimento das empresas de tecnologia, a demanda por programadores aumentou. Atualmente, há mais de 200 mil vagas abertas no Brasil devido à falta de profissionais qualificados.
Metodologia
Quais são os principais diferenciais da DevMedia?
Didática e Metodologia
Com mais de 20 anos de experiência, nossa metodologia foca em menos aulas e mais prática. Desenvolvemos dezenas de projetos e exercícios para ajudar você a se tornar um programador completo. Nossos projetos são desafiadores e autênticos, não apenas exercícios repetitivos.
Projetos reais e exercícios
Você desenvolverá diversos projetos práticos em cada carreira (Front-End, Back-End e Mobile), recebendo mentoria e suporte contínuo. A prática é essencial, e oferecemos milhares de exercícios para ajudar você a fixar o conteúdo e melhorar sua posição no ranking.
Suporte ao aluno
Nossa plataforma oferece suporte dedicado com professores experientes, respondendo suas dúvidas em menos de uma hora. Isso garante que você receba a ajuda necessária durante toda a sua jornada de aprendizado.
Gamificação
A DevMedia utiliza gamificação para tornar o aprendizado mais envolvente e motivador. Você acumula pontos e moedas por acertos, que podem ser trocados por produtos e customizações no seu card pessoal. Além disso, o sistema de ranking mensal incentiva a competição amigável e a melhoria contínua.
O que eu irei aprender estudando pela DevMedia?
Ao estudar conosco, você se tornará um programador Full Stack, dominando Front-End, Back-End e Mobile. Utilizamos a linguagem JavaScript, a mais utilizada no mercado, preparando você para criar sistemas webs e aplicativos celulares. Nossa abordagem prática inclui exercícios para fixar o conhecimento e desenvolvimento de projetos reais que te preparam, para o mercado de trabalho.
Quais as vantagens de aprender programação através da linguagem JavaScript?
Ela é Multiplataforma, ela vai te permitir programar para web e para celulares utilizando praticamente a mesma sintaxe.
Elá é Full Stack. Ela te permite criar aplicações Front-end, Back-end e Mobile. Isso acelera muito sua carreira e aumenta suas possibilidades de pegar trabalhos autônomos e conquistar uma vaga no mercado.
Ela é fácil de aprender. Como ela não exige conhecimento inicial em “Orientação a Objetos” ela se torna mais simples com uma curva de aprendizado suave e vai te permitir começar a programar mais rápido do que outras linguagens
A plataforma oferece certificados?
Sim, oferecemos dois tipos de certificados: o certificado de conclusão, que você adquire ao consumir o conteúdo, e o certificado de autoridade, que você obtém ao acertar exercícios. Ambos possuem carga horária, que pode ser utilizada para fins acadêmicos, como atividades complementares na faculdade, e também para comprovações em processos seletivos ou no seu currículo.
A plataforma tem suporte ao aluno, como funciona?
Sim, temos uma equipe de programadores pronta para ajudar com todas as suas dúvidas! Durante o horário comercial, o tempo médio de resposta é de até 10 minutos. E não se preocupe, também oferecemos suporte à noite e nos finais de semana, com um prazo de resposta um pouco maior.
A DevMedia me forma como programador Full Stack?
Sim! Oferecemos uma formação completa, do zero até Full Stack. Nosso foco é na prática, então você vai encontrar muitos exercícios e projetos reais ao longo do curso. Garantimos que você sairá com a autonomia necessária para desenvolver seus próprios projetos com confiança!
Tem horário para as aulas?
Não, não temos horários fixos para as aulas. Todo o nosso conteúdo está disponível para você acessar a qualquer momento, permitindo que você estude conforme sua própria disponibilidade e ritmo. Dessa forma, você pode integrar o aprendizado à sua rotina de maneira mais flexível e eficaz.
Por que a DevMedia não usa videoaulas em sua didática?
Nosso foco principal é formar programadores de verdade. Sabemos que o dia a dia de um programador envolve muita leitura, interpretação e escrita de código. Por isso, nosso conteúdo é desenvolvido para ambientar você nesse processo desde o início, proporcionando mais autonomia e acelerando seu aprendizado.
Na vídeo-aula é o professor que está lendo, interpretando e escrevndo o código para você, isso limita o seu progresso. Ao ler e interagir diretamente com o conteúdo, você exercita sua capacidade de leitura e concentração, além de poder avançar no seu próprio ritmo. Dessa forma, você se torna um programador mais independente e preparado para os desafios reais do mercado.
Preciso de um computador específico para estudar na DevMedia?
Não é necessário nada específico. Qualquer computador com processador atual e memória de 8 GB é suficiente.
Eu consigo estudar pelo celular?
Sim, a DevMedia possui um aplicativo que te permite seguir com seus estudos de qualquer lugar.
A DevMedia tem aplicativo?
Sim, nosso aplicativo está disponível na Play Store e na Apple Store, permitindo que você estude de forma prática e conveniente em qualquer lugar.
Preciso estar na faculdade para acompanhar os estudos na DevMedia?
Não, a faculdade não é necessária. Você não precisa de nenhum conhecimento prévio para iniciar os estudos na nossa plataforma.
Assinatura e Pagamentos
Quais são os planos de assinatura disponíveis?
Oferecemos o plano anual, o valor total é lançado no cartão de crédito, parcelado em 12 vezes, e você precisa dispor do valor total no limite do seu cartão. Você também pode optar por pagar no PIX
Adquirindo o plano, terei acesso a todo o conteúdo?
Sim, ao assinar nossa plataforma, você desbloqueia acesso total a todo o nosso conteúdo, sem precisar comprar nada separadamente.
A plataforma tem planos vitalícios?
Não, nossos planos são anuais, garantindo que você tenha acesso contínuo às atualizações mais recentes e aos novos conteúdos. A tecnologia evolui rapidamente, e um plano vitalício oferece um conteúdo estático que se tornará ultrapassado em pouco tempo. Com nossos planos anuais, você está sempre à frente, aprendendo as novidades e tendências mais atuais no mundo da programação.
A DevMedia tem fidelidade?
Sim, nosso plano tem uma fidelidade de 12 meses, o que garante o tempo ideal para você explorar nosso conteúdo e desenvolver a autonomia necessária para trabalhar com programação.
Como funciona o cancelamento?
Nós garantimos seu direito de cancelamento com reembolso total dentro dos primeiros 7 dias.
Para que você aproveite ao máximo seu investimento, oferecemos suporte personalizado para orientá-lo na utilização da plataforma. Também temos a opção de transferência de titularidade do plano, permitindo que outra pessoa aproveite o restante do seu período de assinatura.
Cadastro
Como excluir meus dados da plataforma?
Para excluir seus dados da plataforma, acesse o link : https://www.devmedia.com.br/fale-conosco/ e abra um protocolo de 'Exclusão de dados'. Nossa equipe processará a solicitação e removerá todas as informações do seu cadastro.
Compartilhe esse conteúdo com um amigo!
Faça login para ganhar recompensas.
Ou
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.