diff --git a/docs/PadroesDeProjeto/Builder.md b/docs/PadroesDeProjeto/Builder.md new file mode 100644 index 0000000..add8c3f --- /dev/null +++ b/docs/PadroesDeProjeto/Builder.md @@ -0,0 +1,256 @@ +# Builder - GoF Criacional + +## 1. Introdução + +O Padrão Builder, um elemento essencial dos padrões de projeto criacionais, oferece uma abordagem estruturada para enfrentar o desafio de criar objetos complexos. Ao modularizar o processo de construção e promover a escalabilidade, ele capacita os desenvolvedores a produzir diversas representações de produtos com clareza e precisão. Em um cenário de software em constante evolução, o Padrão Builder destaca-se como um modelo de criação de objetos flexível e claro, facilitando a manutenção e extensão do código. + +## 2. Objetivo +No MyMarket um produto pode ter vários atributos obrigatórios e opcionais que precisam ser preenchidos para um objeto ser construído. Pensando nisto, uma forma de evitar um construtor enorme com muitos campos nulos preenchidos seria criar um Builder para fornecer uma implementação mais limpa do objeto Produto. + +Como exemplo, considere os seguintes atributos: + +### Atributos Obrigatórios: + +- id (int): Identificador único do produto. +- name (String): Nome do produto. +- price (double): Preço do produto. +- quantity (int): Quantidade em estoque. +- category (String): Categoria do produto. + +### Atributos Opcionais: + +- description (String): Descrição do produto. +- brand (String): Marca do produto. +- size (String): Tamanho do produto (ex: P, M, G, GG ou especificações como 15cm x 10cm). +- color (String): Cor do produto. +- weight (double): Peso do produto. +- dimensions (String): Dimensões do produto (ex: 30cm x 20cm x 10cm). +- material (String): Material do produto. +- manufacturer (String): Fabricante do produto. +- warranty (String): Garantia do produto. +- sku (String): Stock Keeping Unit, código de rastreamento do produto. +- releaseDate (LocalDate): Data de lançamento do produto. +- ratings (double): Classificação média do produto. +- numReviews (int): Número de avaliações do produto. +- imageURL (String): URL da imagem do produto. +- tags (List): Lista de tags associadas ao produto. + +## 3. Implementação +... +### 3.1. Diagrama UML + + +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +![Builder](https://github.com/user-attachments/assets/5274db2c-c138-437b-af9d-d99f9d52741d) + + +
Figura 01: Diagrama de Classes utilizando o padrão criacional Builder. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +### 3.2. Código + +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +```java +import java.time.LocalDate; +import java.util.List; + +public class Product { + private final int id; + private final String name; + private final double price; + private final int quantity; + private final String category; + private final String description; + private final String brand; + private final String size; + private final String color; + private final double weight; + private final String dimensions; + private final String material; + private final String manufacturer; + private final String warranty; + private final String sku; + private final LocalDate releaseDate; + private final double ratings; + private final int numReviews; + private final String imageURL; + private final List tags; + + private Product(ProductBuilder builder) { + this.id = builder.id; + this.name = builder.name; + this.price = builder.price; + this.quantity = builder.quantity; + this.category = builder.category; + this.description = builder.description; + this.brand = builder.brand; + this.size = builder.size; + this.color = builder.color; + this.weight = builder.weight; + this.dimensions = builder.dimensions; + this.material = builder.material; + this.manufacturer = builder.manufacturer; + this.warranty = builder.warranty; + this.sku = builder.sku; + this.releaseDate = builder.releaseDate; + this.ratings = builder.ratings; + this.numReviews = builder.numReviews; + this.imageURL = builder.imageURL; + this.tags = builder.tags; + } + + public static class ProductBuilder { + private final int id; + private final String name; + private final double price; + private final int quantity; + private final String category; + private String description; + private String brand; + private String size; + private String color; + private double weight; + private String dimensions; + private String material; + private String manufacturer; + private String warranty; + private String sku; + private LocalDate releaseDate; + private double ratings; + private int numReviews; + private String imageURL; + private List tags; + + public ProductBuilder(int id, String name, double price, int quantity, String category) { + this.id = id; + this.name = name; + this.price = price; + this.quantity = quantity; + this.category = category; + } + + public ProductBuilder setDescription(String description) { + this.description = description; + return this; + } + + public ProductBuilder setBrand(String brand) { + this.brand = brand; + return this; + } + + public ProductBuilder setSize(String size) { + this.size = size; + return this; + } + + public ProductBuilder setColor(String color) { + this.color = color; + return this; + } + + public ProductBuilder setWeight(double weight) { + this.weight = weight; + return this; + } + + public ProductBuilder setDimensions(String dimensions) { + this.dimensions = dimensions; + return this; + } + + public ProductBuilder setMaterial(String material) { + this.material = material; + return this; + } + + public ProductBuilder setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + return this; + } + + public ProductBuilder setWarranty(String warranty) { + this.warranty = warranty; + return this; + } + + public ProductBuilder setSku(String sku) { + this.sku = sku; + return this; + } + + public ProductBuilder setReleaseDate(LocalDate releaseDate) { + this.releaseDate = releaseDate; + return this; + } + + public ProductBuilder setRatings(double ratings) { + this.ratings = ratings; + return this; + } + + public ProductBuilder setNumReviews(int numReviews) { + this.numReviews = numReviews; + return this; + } + + public ProductBuilder setImageURL(String imageURL) { + this.imageURL = imageURL; + return this; + } + + public ProductBuilder setTags(List tags) { + this.tags = tags; + return this; + } + + public Product build() { + return new Product(this); + } + } + +} + +// Exemplo de uso +import java.time.LocalDate; +import java.util.Arrays; + +public class Main { + public static void main(String[] args) { + Product product = new Product.ProductBuilder(1, "T-Shirt", 29.99, 50, "Clothing") + .setDescription("Comfortable cotton t-shirt") + .setBrand("FashionBrand") + .setSize("M") + .setColor("Blue") + .setWeight(0.2) + .setDimensions("40cm x 30cm x 1cm") + .setMaterial("Cotton") + .setManufacturer("FashionBrand Inc.") + .setWarranty("6 months") + .setSku("TSHIRT12345") + .setReleaseDate(LocalDate.of(2024, 4, 1)) + .setRatings(4.7) + .setNumReviews(200) + .setImageURL("http://example.com/tshirt.jpg") + .setTags(Arrays.asList("clothing", "t-shirt", "fashion")) + .build(); + + System.out.println(product); + } +} + + +``` + +Observe: Atualmente há algumas ferramentas, por exemplo, o Lombok para a linguagem Java, que permitem criar um Builder. No caso do Lombok basta usar a anotação @Builder na classe Product. + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md new file mode 100644 index 0000000..c295e52 --- /dev/null +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -0,0 +1,136 @@ +# Chain of Responsibility - GoF Comportamental + +## 1. Introdução + +O Chain of Responsibility é um padrão de projeto comportamental que permite que pedidos sejam enviados por uma cadeia de handlers (manipuladores). Cada handler na cadeia tem a oportunidade de processar o pedido ou passá-lo para o próximo handler. Este padrão promove o desacoplamento entre o remetente do pedido e seus receptores, facilitando a adição ou modificação de handlers sem impactar os demais componentes do sistema. + +## 2. Objetivo +No aplicativo My Market, um pedido precisa passar por várias etapas de validação e processamento antes de ser aprovado. Cada uma dessas etapas pode ser gerenciada por um módulo diferente do sistema. Por exemplo: + +- Verificação de Estoque: Primeira etapa onde o sistema verifica se o item solicitado está disponível em estoque. +- Validação de Pagamento: Após a verificação de estoque, o sistema valida as informações de pagamento do cliente. +- Aprovação do Gerente: Finalmente, o pedido pode necessitar de uma aprovação adicional por parte de um gerente, especialmente para transações de alto valor ou itens restritos. + +Cada uma dessas etapas é responsabilidade de um handler específico. O padrão Chain of Responsibility permite que o pedido seja passado sequencialmente por cada handler, onde cada um decide se processa o pedido ou o encaminha para o próximo handler. Isso promove uma estrutura flexível e modular, facilitando a manutenção e a expansão do sistema. + +## 3. Implementação +... +### 3.1. Diagrama UML + + +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) + + +
Figura 01: Diagrama de Classes utilizando o padrão comportamental Chains of Responsibility. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +### 3.2. Código + +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +```java +public interface Handler { + Handler setNext(Handler handler); + String handle(Request request); +} + +public abstract class BaseHandler implements Handler { + private Handler nextHandler; + + @Override + public Handler setNext(Handler handler) { + this.nextHandler = handler; + return handler; + } + + @Override + public String handle(Request request) { + if (this.nextHandler != null) { + return this.nextHandler.handle(request); + } + return null; + } +} + +public class EstoqueHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isEstoqueDisponivel()) { + System.out.println("Estoque verificado."); + return super.handle(request); + } else { + return "Pedido rejeitado: estoque insuficiente."; + } + } +} + +public class PagamentoHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isPagamentoValidado()) { + System.out.println("Pagamento validado."); + return super.handle(request); + } else { + return "Pedido rejeitado: pagamento não validado."; + } + } +} + +public class GerenteHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isAprovadoPeloGerente()) { + System.out.println("Aprovado pelo gerente."); + return super.handle(request); + } else { + return "Pedido rejeitado: não aprovado pelo gerente."; + } + } +} + +public class Request { + private boolean estoqueDisponivel; + private boolean pagamentoValidado; + private boolean aprovadoPeloGerente; + + public boolean isEstoqueDisponivel() { + return estoqueDisponivel; + } + + public void setEstoqueDisponivel(boolean estoqueDisponivel) { + this.estoqueDisponivel = estoqueDisponivel; + } + + public boolean isPagamentoValidado() { + return pagamentoValidado; + } + + public void setPagamentoValidado(boolean pagamentoValidado) { + this.pagamentoValidado = pagamentoValidado; + } + + public boolean isAprovadoPeloGerente() { + return aprovadoPeloGerente; + } + + public void setAprovadoPeloGerente(boolean aprovadoPeloGerente) { + this.aprovadoPeloGerente = aprovadoPeloGerente; + } +} +``` + + + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 2.0 | Adição o código da implementação do GoF. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 3.0 | Adição do Diagrama. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 3.1 | Pequenos Ajustes nos textos do diagrama e no do código. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | diff --git a/docs/PadroesDeProjeto/Facade.md b/docs/PadroesDeProjeto/Facade.md new file mode 100644 index 0000000..58742b6 --- /dev/null +++ b/docs/PadroesDeProjeto/Facade.md @@ -0,0 +1,138 @@ +# Facade - GoF Estrutural + +## 1. Introdução + +O Facade(Fachada) é um padrão de projeto estrutural que permite fornecer uma interface unificada para um conjunto de interfaces em um subsistema. O uso do Facade garante uma interface de comunicação entre sistemas de forma clara e segura. + +## 2. Objetivo + +Considerando o projeto My Market, para realizar uma compra precisamos utilizar vários serviços, conferir o estoque, pagamento, transporte. Dessa forma, podemos utilizar o padrão de Facade para criar uma interface de forma que o cliente só se comunique com a interface e que cada sistema só se comunique com a interface. + + +## 3. Implementação + + +### 3.1. Diagrama UML + + +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +![facade](https://github.com/user-attachments/assets/d3f6fe6a-e129-4f3d-9115-08bde8899d37) + + +
Figura 01: Diagrama de Classes utilizando o padrão estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +### 3.2. Código + +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +```java + +public class MyMarketApp { + + public static void main(String[] args) { + + PedidoFacade facade = new InsFacade(); + CarrinhoController controller = new CarrinhoController(facade); + controller.selecionarProduto(1); + boolean resultado = controller.isPedidoRealizado(); + System.out.println("Pedido concluído? " + resultado); + + } +} + + +public interface PedidoFacade { + + boolean criarPedido(int idProduto); + +} + + +public class InsFacade implements PedidoFacade { + + public boolean criarPedido(int idProduto) { + + boolean pedidoRealizado = false; + + Produto produto = new Produto(); + produto.id = idProduto; + + if (EstoqueService.isDisponivel(produto)) { + System.out.println("Produto com ID " + produto.id + " está disponível!"); + boolean pagtoConfirmado = PagamentoService.realizarPagamento(); + if (pagtoConfirmado) { + System.out.println("Pagamento confirmado..."); + TransportadorService.entregarProduto(produto); + System.out.println("Produto despachado..."); + pedidoRealizado = true; + } + } + return pedidoRealizado; + } +} + + +public class CarrinhoController { + + private PedidoFacade facade; + private boolean pedidoRealizado = false; + + public CarrinhoController(PedidoFacade facade) { + this.facade = facade; + } + + public void selecionarProduto(int idProduto) { + pedidoRealizado = facade.criarPedido(idProduto); + } + + + public boolean isPedidoRealizado() { + return pedidoRealizado; + } +} + + +public class EstoqueService { + + public static boolean isDisponivel(Produto product) { + /* Verifica no banco de dados a disponibilidade do produto */ + return true; + } +} + + +public class PagamentoService { + + public static boolean realizarPagamento() { + /* Conecta com o serviço de pagamento selecionado. */ + return true; + } +} + + +public class TransportadorService { + + public static void entregarProduto(Produto product) { + /* Conecta ao serviço do transportador para entregar o produto */ + } +} + + +``` + + + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +> **Padrão de Projeto Facade em Java**. +[material devMedia](http://www.devmedia.com.br/padrao-de-projeto-facade-em-java/26476) + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | +| 2.0 | Adição do código e Diagrama | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x |