Eu estava estudando o Padrão Decorador conforme documentado no GOF .
Por favor, ajude-me a entender o Padrão Decorador . Alguém poderia dar um exemplo de caso de uso de onde isso é útil no mundo real?
decorator
design-patterns
odiseh
fonte
fonte
Respostas:
Considere um caso de uma pizzaria. Na pizzaria, eles venderão poucas variedades de pizza e também fornecerão coberturas no menu. Agora imagine uma situação em que se a pizzaria precisar fornecer preços para cada combinação de pizza e cobertura. Mesmo se houver quatro pizzas básicas e oito coberturas diferentes, o aplicativo ficaria louco, mantendo toda essa combinação concreta de pizzas e coberturas.
Aí vem o padrão do decorador.
De acordo com o padrão do decorador, você implementará coberturas à medida que decoradores e pizzas serão decoradas pelos decoradores dessas coberturas. Praticamente cada cliente deseja coberturas de seu desejo e o valor final da fatura será composto pelas pizzas básicas e coberturas encomendadas adicionalmente. Cada decorador de cobertura saberia sobre as pizzas que está decorando e seu preço. O método GetPrice () do objeto Cobertura retornaria o preço cumulativo da pizza e da cobertura.
EDITAR
Aqui está um exemplo de código da explicação acima.
fonte
Este é um exemplo simples de adição de novo comportamento a um objeto existente dinamicamente, ou o padrão Decorator. Devido à natureza das linguagens dinâmicas, como o Javascript, esse padrão se torna parte da própria linguagem.
fonte
switch
ou de um simplesif
, você seria capaz de afirmar que este é um ótimo exemplo de adição dinâmica de comportamento a uma classe. Porém, precisamos de pelo menos duas classes para definir um decorador e objetos decorados nesse padrão.Vale ressaltar que o modelo Java i / o é baseado no padrão decorador. As camadas deste leitor em cima desse leitor em cima de ... é um exemplo de decorador realmente real.
fonte
Exemplo - Cenário - Digamos que você esteja escrevendo um módulo de criptografia. Essa criptografia pode criptografar o arquivo limpo usando o padrão de criptografia DES - Data. Da mesma forma, em um sistema, você pode ter a criptografia como padrão de criptografia AES - Advance. Além disso, você pode ter a combinação de criptografia - primeiro DES e depois AES. Ou você pode ter primeiro AES, depois DES.
Discussão - Como você vai lidar com essa situação? Você não pode continuar criando o objeto dessas combinações - por exemplo - AES e DES - total de 4 combinações. Portanto, você precisa ter 4 objetos individuais. Isso se tornará complexo à medida que o tipo de criptografia aumentar.
Solução - Continue construindo as combinações de pilhas, dependendo da necessidade - em tempo de execução. Outra vantagem dessa abordagem de pilha é que você pode desenrolá-la facilmente.
Aqui está a solução - em C ++.
Primeiro, você precisa de uma classe base - uma unidade fundamental da pilha. Você pode pensar como a base da pilha. Neste exemplo, é um arquivo claro. Vamos seguir sempre o polimorfismo. Faça primeiro uma classe de interface desta unidade fundamental. Dessa forma, você pode implementá-lo como desejar. Além disso, você não precisa pensar em dependência enquanto inclui esta unidade fundamental.
Aqui está a classe de interface -
Agora, implemente essa classe de interface -
Agora, vamos criar uma classe abstrata do decorador - que pode ser estendida para criar qualquer tipo de sabor - aqui o sabor é do tipo de criptografia. Esta classe abstrata do decorador está relacionada à classe base. Assim, o decorador "é um" tipo de classe de interface. Portanto, você precisa usar a herança.
Agora, vamos fazer uma classe de decorador concreto - Tipo de criptografia - AES -
Agora, digamos que o tipo de decorador seja DES -
const std :: string desEncrypt = "DES criptografado";
Vamos criar um código de cliente para usar essa classe decoradora -
Você verá os seguintes resultados -
Aqui está o diagrama UML - Representação de classe dele. No caso, você deseja pular o código e se concentrar no aspecto do design.
fonte
strategy pattern
?O padrão Decorator ajuda você a alterar ou configurar uma funcionalidade do seu objeto encadeando com outras subclasses semelhantes desse objeto.
O melhor exemplo seria as classes InputStream e OutputStream no pacote java.io
fonte
O que é o Decorator Design Pattern em Java.
A definição formal do padrão Decorator do livro GoF (Design Patterns: Elements of Reusable Oriented Object Oriented, 1995, Pearson Education, Inc. Publishing como Pearson Addison Wesley) diz que você pode,
"Anexe responsabilidades adicionais a um objeto dinamicamente. Os decoradores oferecem uma alternativa flexível à subclasse para ampliar a funcionalidade".
Digamos que temos uma Pizza e queremos decorá-la com coberturas como frango Masala, cebola e queijo mussarela. Vamos ver como implementá-lo em Java ...
Programa para demonstrar como implementar o Decorator Design Pattern em Java.
Pizza.java:
fonte
Eu usei extensivamente o padrão Decorator no meu trabalho. Fiz um post no meu blog sobre como usá-lo com o log.
fonte
Vamos dar um exemplo em que você precisa criar um aplicativo que calcule o preço de diferentes tipos de hambúrgueres. Você precisa lidar com diferentes variações de hambúrgueres, como "grande" ou "com queijo", cada qual com um preço em relação ao hambúrguer básico. Por exemplo, adicione US $ 10 por hambúrguer com queijo, US $ 15 a mais por hambúrguer grande, etc.
Nesse caso, você pode ser tentado a criar subclasses para lidar com elas. Podemos expressar isso em Ruby como:
No exemplo acima, a classe BurgerWithCheese herda do Burger e substitui o método price para adicionar US $ 15 ao preço definido na superclasse. Você também criaria uma classe LargeBurger e definiria o preço em relação ao Burger. Mas você também precisa definir uma nova classe para a combinação de "grande" e "com queijo".
Agora, o que acontece se precisarmos servir "hambúrguer com batatas fritas"? Já temos 4 classes para lidar com essas combinações e precisaremos adicionar mais 4 para lidar com todas as combinações das 3 propriedades - "grande", "com queijo" e "com batatas fritas". Precisamos de 8 aulas agora. Adicione outra propriedade e precisaremos de 16. Isso aumentará como 2 ^ n.
Em vez disso, vamos tentar definir um BurgerDecorator que aceite um objeto Burger:
No exemplo acima, criamos uma classe BurgerDecorator, da qual a classe BurgerWithCheese herda. Também podemos representar a variação "grande" criando a classe LargeBurger. Agora poderíamos definir um hambúrguer grande com queijo em tempo de execução como:
Lembre-se de que o uso da herança para adicionar a variação "com batata frita" envolveria a adição de mais 4 subclasses? Com os decoradores, criaríamos apenas uma nova classe, BurgerWithFries, para lidar com a nova variação e lidar com isso em tempo de execução. Cada nova propriedade precisaria de apenas mais decorador para cobrir todas as permutações.
PS. Esta é a versão curta de um artigo que escrevi sobre o uso do Decorator Pattern em Ruby , que você pode ler se desejar descobrir exemplos mais detalhados.
fonte
Decorador:
Consulte o artigo de criação de fontes para obter mais detalhes.
Decorador (Resumo) : é uma classe / interface abstrata que implementa a interface do componente. Ele contém interface de componentes. Na ausência dessa classe, você precisa de muitas subclasses de ConcreteDecorators para diferentes combinações. A composição do componente reduz subclasses desnecessárias.
Exemplo de JDK:
Dê uma olhada na pergunta SE abaixo para obter exemplos de diagrama e código UML.
Padrão Decorador para IO
Artigos úteis:
journaldev
wikipedia
Exemplo real de palavras do padrão Decorator: VendingMachineDecorator foi explicado @
Quando usar o padrão do decorador?
No exemplo acima, chá ou café (bebidas) foi decorado com açúcar e limão.
fonte
O padrão Decorator atinge um objetivo único de adicionar dinamicamente responsabilidades a qualquer objeto .
O modelo de E / S Java é baseado no padrão decorador.
fonte
Há um exemplo na Wikipedia sobre a decoração de uma janela com barra de rolagem:
http://en.wikipedia.org/wiki/Decorator_pattern
Aqui está outro exemplo muito "do mundo real" de "Membro da equipe, líder da equipe e gerente", que ilustra que o padrão do decorador é insubstituível com uma herança simples:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
fonte
Algum tempo atrás, refatorei uma base de código para usar o padrão Decorator, então tentarei explicar o caso de uso.
Vamos supor que temos um conjunto de serviços e, com base em se o usuário adquiriu a licença de um serviço específico, precisamos iniciar o serviço.
Todos os serviços têm uma interface comum
Pré-refatoração
Se você observar atentamente,
ServiceSupport
dependeLicenseManager
. Mas por que deveria dependerLicenseManager
? E se precisássemos de um serviço em segundo plano que não precise verificar as informações da licença. Na situação atual, teremos de alguma forma treinarLicenseManager
para retornartrue
aos serviços em segundo plano. Essa abordagem não me pareceu bem. De acordo com mim, a verificação da licença e outras lógicas eram ortogonais entre si.Então o Decorator Pattern vem em socorro e aqui começa a refatoração com TDD.
Pós-refatoração
Aprendizado
fonte
Vamos dar um exemplo do PubG. As espingardas de assalto funcionam melhor com zoom 4x e enquanto estivermos nele, também precisaremos de compensador e supressor. Reduzirá o recuo e o som do disparo, bem como o eco. Precisamos implementar esse recurso, onde permitiremos que os jogadores comprem sua arma favorita e seus acessórios. Os jogadores podem comprar a arma ou parte do acessório ou todo o acessório e eles serão cobrados de acordo.
Vamos ver como o padrão do decorador é aplicado aqui:
Suponha que alguém queira comprar o SCAR-L com todos os três acessórios mencionados acima.
Isso levará a um diagrama de classes como este:
Agora, podemos ter aulas como esta:
Da mesma forma, também podemos adicionar outros acessórios e decorar a nossa arma.
Referência:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
fonte
Padrão de design do decorador : esse padrão ajuda a modificar as características de um objeto em tempo de execução. Ele fornece sabores diferentes para um objeto e oferece flexibilidade para escolher quais ingredientes queremos usar nesse sabor.
Exemplo da vida real: digamos que você tenha um assento na cabine principal em um voo. Agora você pode escolher várias comodidades com o assento. Cada comodidade tem seu próprio custo associado. Agora, se um usuário escolher Wifi e comida premium, ele será cobrado por assento + wifi + comida premium.
Nesse caso, o padrão de design do decorador pode realmente nos ajudar. Visite o link acima para entender mais sobre o padrão do decorador e a implementação de um exemplo da vida real.
fonte