Série DesignPattern: Decorator

Olá Pessoal,

No post de hoje vamos conhecer mais um design pattern: o Decorator. Como sempre, teremos um exemplo simples para pegarmos a ideia de onde podemos adotá-lo.

Lets go…

Decorator

Tem como objetivo adicionar funcionalidade ao objeto dinamicamente, que normalmente trata-se de uma funcionalidade opcional.

Exemplo:

Alguns modelos de carros saem de fabrica sem alguns itens, pois são considerados opcionais pelos fabricantes para os modelos XYZ. Esses opcionais são os decorators.

Vamos supor que a Volks vai adicionar um item na Fabricação de um novo carro, ou seja, uma nova funcionalidade será adicionada ao sistema de fabricação daquele modelo específico. Então essa funcionalidade será implementada por um novo objeto: decorator, mas queremos aproveitar o que já existe no modelo atual, ou seja, não quero trocar todo o meu sistema de produção somente para adicionar neon aos faróis, mas quero comprar um equipamento que possa adicionar ao meu sistema de produção atual e dizer ao sistema o seguinte: “se o carro que está na esteira é do tipo new fox, o farol será de neon, caso seja do tipo fox, será o farol normal”.

O decorator

O decorator é uma classe abstract que implementa a mesma interface do modelo atual. As classes concretas vão extends abstract Decorator que terá a nova funcionalidade. Na prática, eu posso dizer que o novo modelo de carro chamado “New Fox” vai extends abstract Decorator. Lembre-se que a nova funcionalidade só é chamada quando o novo tipo é invocado na construção/criação do objeto.

No dia-dia

É muito comum isso acontecer depois de certo tempo que a aplicação já está em produção. Os motivos são vários: mudanças nas regras de negócios, necessidade específica do usuário etc. Um caso bem comum é futuramente o usuário querer um novo tipo de relatório com informações que apenas o user do tipo administrador pode ter acesso. Nessa funcionalidade podemos usar o Decorator para ter as novas informações que não constam nos relatórios já existentes.  Veja no diagrama a seguir como seria um cenário com o Decorator.

Desenvolvendo

Chegou a hora de colocarmos a mão na massa com decorator. A seguir temos o projeto que criei para vermos o decorator em ação. Como sempre, adicionei comentários in line com o objetivo de deixar o código mais didático.

Interface

A seguir temos a interface que fabrica os faróis:

package br.com.camilolopes.interfaces;

public interface Fabrica {

                void farol(String mensagem);

}

Fox.java

É uma classe que representa um tipo de carro que tem os faróis de um determinado tipo:

package br.com.camilolopes.classes;

 import br.com.camilolopes.interfaces.Fabrica;

 public class Fox implements Fabrica {

                @Override

               public void farol(String mensagem) {

                               System.out.println(“adicionando farois comuns ao ” + mensagem);           

                }

}

NewFarol.java

É a classe decorator que implementa a mesma interface que os carros comuns já implementam para os faróis.

package br.com.camilolopes.decorator;

import br.com.camilolopes.interfaces.Fabrica;

/*

 * aqui é o nosso decorator

 */

public abstract class NewFarol implements Fabrica {

                @Override

                public  abstract void farol(String mensagem);        

}

NewFox.java

É uma classe que representa o novo tipo de carro que vai possuir os novos faróis.

package br.com.camilolopes.decorator;

/*

 * classe que vai ter a nova funcionalidade implementada

 * conhecida como: ConcreteDecorator

 */

public class NewFox extends NewFarol {

                @Override

                public void farol(String mensagem) {

                               System.out.println(“Adicionando Farol de Neon”);

                               System.out.println(this.farolNeon() + ” ao ” + mensagem);

                }

                //nova funcionalidade sendo adicionado ao farol

                public String farolNeon() {

                               return “Farol de neon adicionado com sucesso”;

                }

}

FabricaMain.java

Essa é a classe que vai fabricando os carros com  base no tipo ela adiciona as funcionalidades corretamente. Como podemos ver, quando o tipo do carro for NewFox os faróis adicionados serão diferentes do modelo Fox.

 package br.com.camilolopes.main;

import br.com.camilolopes.classes.Fox;

import br.com.camilolopes.decorator.NewFox;

import br.com.camilolopes.interfaces.Fabrica;

public class FabricaMain {

            public static void main(String[] args) {

                        // chegou na esteira o modelo newFox

                        Fabrica fabrica1 = new NewFox();

                        fabrica1.farol(“New Fox”);

                        //chegou na esteira o modelo fox

                        Fabrica fabrica2 = new Fox();

                        fabrica2.farol(“Fox”);

            }

}

Rode sua aplicação para ver o resultado

Resultado

A seguir, o resultado no console:

Vou ficando por aqui, esse foi o design pattern Decorator. Espero que tenham curtido o post de hoje. Até o próximo post.

Abracos, see ya!

Deixe um comentário

O seu endereço de e-mail não será publicado.