Skip to content

Commit

Permalink
Merge pull request #29 from UnBArqDsw2024-1/main
Browse files Browse the repository at this point in the history
Atualiza branch
  • Loading branch information
AlefMemTav authored Jul 24, 2024
2 parents e12c75d + 6a55e52 commit 605a3b1
Show file tree
Hide file tree
Showing 12 changed files with 581 additions and 0 deletions.
90 changes: 90 additions & 0 deletions docs/PadroesDeProjeto/Decorator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Decorator - GoF Estrutural

## 1. Introdução

O padrão Decorator permite adicionar responsabilidades a objetos de forma dinâmica. Este padrão é útil quando você deseja estender as funcionalidades de classes de maneira flexível e sem a necessidade de modificar o código existente.

Você define uma interface comum para os componentes e os decoradores. Os decoradores implementam essa interface e adicionam funcionalidades adicionais ao encapsular os componentes.

## 2. Objetivo

Demonstrar o uso do padrão de design estrutural Decorator, que permite adicionar novas funcionalidades a objetos de forma dinâmica. Vamos aplicar diferentes funcionalidades a produtos de tipos variados (alimentos e eletrônicos) usando decoradores concretos (implementações de funcionalidades adicionais).

## 3. Implementação
### 3.1 Diagrama UML
Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/).

![diagrama-decorator](https://github.com/user-attachments/assets/16877221-6a08-4368-ace0-35dffd14ae0f)
<h6 align = "center">Figura 1: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

### 3.2 Código
O código foi desenvolvido em Java , Com a colaboração de [Pedro Henrique ](https://github.com/pehenobra2) e [Guilherme Nishimura](https://github.com/Guilherme-nishi).Para ter o codigo desenvolvido acesse [ aqui](https://github.com/UnBArqDsw2024-1/2024.1_G7_My_Market/tree/Guilherme_Pedro/Entrega03/docs/PadroesDeProjeto/src/Decorator/Main.java).

#### 3.2.1 Classe base Product
Essa classe se encontra em Main.JAVA

![product-decorator](https://github.com/user-attachments/assets/9816f193-8c89-4dff-96fb-8e7d912f1249)
<h6 align = "center">Figura 3:Product Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.2 Subclasse Food
Essa classe se encontra em Main.java

![subclasse-food-decorator](https://github.com/user-attachments/assets/1c80e937-4e87-4d12-b458-951940ed8ca8)
<h6 align = "center">Figura 3: Subclasse Food. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.3 Subclasse Eletronics
Essa classe se encontra em Main.java

![subclasse-eletronics-decorator](https://github.com/user-attachments/assets/528186c1-8c8d-4089-a5f8-9e3f48518742)
<h6 align = "center">Figura 4: Subclasse Eletronics. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.3 Subclasse DiscountDecorator
Essa classe se encontra em Main.java

![DiscountDecorator](https://github.com/user-attachments/assets/921130fd-472f-4d20-81e3-720953a96bb1)
<h6 align = "center">Figura 5: Subclasse DiscountDecorator. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.4 Subclasse FixedDiscountDecorator
Essa classe se encontra em Main.java

![fixedDiscountDecorator](https://github.com/user-attachments/assets/8f98e7ff-41af-4e2e-858f-04c046b381fe)
<h6 align = "center">Figura 6: Subclasse FixedDiscountDecorator. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.5 Subclasse PercentageDiscountDecorator
Essa classe se encontra em Main.java

![PercentageDiscountDecorator](https://github.com/user-attachments/assets/335ddb91-6359-4713-b21f-479ade778bf1)
<h6 align = "center">Figura 7: Subclasse PercentageDiscountDecorator. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.6 Main.java
Essa classe se encontra em Main.java

![main-decorator](https://github.com/user-attachments/assets/b2ed8fa9-ffc9-48cc-83cc-9819108b9f05)
<h6 align = "center">Figura 7: Subclasse PercentageDiscountDecorator. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

## Resultado
Abaixo esta o resultado do código que aplica o padrão de projeto Decorator, criando dois produtos: uma banana com preço original de $1,00 e um smartwatch com preço original de $250,00. O código aplica um desconto percentual de 10% na banana, resultando em um preço com desconto de $0,90. Para o smartwatch, é aplicado um desconto fixo de $50,00, resultando em um preço com desconto de $200,00. Esses resultados demonstram como o padrão Decorator pode ser utilizado para adicionar funcionalidades de desconto aos produtos de maneira flexível e extensível.


![image](https://github.com/user-attachments/assets/5b45b3f2-101d-4fe3-84f1-e0a7958c9105)

<h6 align = "center">Figura 8: Resultado. Fonte: Guilherme Nishimura e Pedro Henrique</h6>


## Referências

> **Arquitetura e Desenho de Software - Aula GoFs Estruturais**. Material de apoio em slides. Milene Serrano.
> **Design Patterns: Padrões “GoF”**. Disponível em: https://www.devmedia.com.br/design-patterns-padroes-gof/16781. Acesso em:24/07/2024
> **Decorator** Disponível em: https://refactoring.guru/pt-br/design-patterns/decorator. Acesso em 24/07/2024
## Versionamento

| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão |
| :------: | :---: | :-----: | :----: | :----: | :-----: |
| 1.0 | Inicio da estrutura do documento | Pedro Henrique |x | 24/07/2023| x|
| 1.1 | Adicionando mudanças | Pedro Henrique | Guilherme Nishimura | 24/07/2023| 24/07/2023|
| 1.2 | Mais ajustes | Pedro Henrique | Guilherme Nishimura | 24/07/2023| 24/07/2023|




94 changes: 94 additions & 0 deletions docs/PadroesDeProjeto/factoryMethod.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Factory Method - GoF Criacional

## 1. Introdução

O padrão Factory Method é um padrão de criação que define uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos que serão criados. Esse padrão promove a flexibilidade e a extensibilidade, permitindo que novas classes de produtos sejam adicionadas sem modificar o código existente.

Para implementar o padrão Factory Method, primeiramente defina uma classe base abstrata ou interface que declare os métodos comuns a todas as subclasses. Em seguida, cria subclasses concretas que implementem ou herdem da classe base, fornecendo usas próprias implementações específicas. Depois, defina uma classe abstrata ou interface Factory com um método abstrato para criar objetos do da classe base. Cria subclasses concretas Factory que implementem o método para instanciar e retornar objetos das subclasses específicas. Finalmente, no código cliente, utilize as Factorys concretas para criar instâncias das subclasses criadas sempre precisar conhecer a classe exata da subclasse, promovendo flexibilidade e extensibilidade no sistema.

## 2. Objetivo

O objetivo do padrão de design criacional Factory Method é fornecer uma interface para criar objetos em uma superclasse, permitindo que as subclasses decidam qual classe instanciar. No contexto de uma hierarquia de produtos, como Product, Food e Electronics, o Factory Method permite que a criação de instâncias específicas desses produtos seja delegada a fábricas concretas. Isso promove a flexibilidade e a extensibilidade do sistema, pois novas subclasses de Product podem ser adicionadas sem modificar o código existente. Cada fábrica concreta (FoodFactory e ElectronicsFactory) implementa o método de criação definido na superclasse de fábrica (ProductFactory), garantindo que cada tipo de produto seja instanciado de maneira consistente e encapsulada. Dessa forma, o código cliente pode criar objetos de diferentes tipos de produtos sem precisar conhecer as classes exatas, facilitando a manutenção e a expansão do sistema.

## 3. Implementação
### 3.1. Diagrama UML
Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/).

![diagrama-factory-method](https://github.com/user-attachments/assets/fbab7b72-97ad-4846-b966-e7b25e6ff6b2)

<h6 align = "center">Figura 1: Generalização produto. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

### 3.2. Código
O código foi desenvolvido em Java , Com a colaboração de [Pedro Henrique ](https://github.com/pehenobra2) e [Guilherme Nishimura](https://github.com/Guilherme-nishi).Para ter o codigo desenvolvido acesse [ aqui](https://github.com/UnBArqDsw2024-1/2024.1_G7_My_Market/tree/Guilherme_Pedro/Entrega03/docs/PadroesDeProjeto/src/FactoryMethod/Main.java).

#### 3.2.1 Classe base Product
Essa classe se encontra em Main.java

![classe-product](https://github.com/user-attachments/assets/a192c3eb-5006-4c03-806d-aad0fe9739f4)

<h6 align = "center">Figura 2: Classe base Product. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.2 Subclasse Food
Essa classe se encontra em Main.java

![subclasse-food](https://github.com/user-attachments/assets/0d8597a4-221c-4c53-9b6f-54bbdea2aab8)

<h6 align = "center">Figura 3: Subclasse Food. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.3 Subclasse Eletronics
Essa classe se encontra em Main.java

![subclasse-eletronics](https://github.com/user-attachments/assets/76208872-80fc-4865-8170-ccadb81e7fa9)

<h6 align = "center">Figura 4: Subclasse Eletronics. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.4 ProductFactory
Essa classe se encontra em Main.java

![productFactory](https://github.com/user-attachments/assets/860008e8-d3c2-453e-afba-5611b913dd37)

<h6 align = "center">Figura 5: ProductFactory. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.5 Subclasse FoodFactory
Essa classe se encontra em Main.java

![foodFactory](https://github.com/user-attachments/assets/bdbc3a76-158d-4b7f-8c2e-e7012c202682)

<h6 align = "center">Figura 6: Subclasse FoodFactory. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.6 Subclasse EletronicsFactory
Essa classe se encontra em Main.java

![eletronicsFactory](https://github.com/user-attachments/assets/1b53b05f-8f6c-4be4-a950-74ebec93759b)

<h6 align = "center">Figura 7: Subclasse EletronicsFactory. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

#### 3.2.7 Main
Essa parte do código se encontra em Main.java

![main](https://github.com/user-attachments/assets/ad80ee3a-05f5-49c2-80b5-b07cd33f1c71)

<h6 align = "center">Figura 8: Main. Fonte: Guilherme Nishimura e Pedro Henrique</h6>

## Resultado
A imagem abaixo ilustra o resultado do código que aplica o padrão de projeto Factory Method, criando 2 produtos banana com preço 10,00 reais, e Smartwatch com preço 299,99 reais.

![image](https://github.com/user-attachments/assets/f6b82f51-65b8-4f9a-aaba-39a792de02ab)

<h6 align = "center">Figura 9: Resultados Fonte: Guilherme Nishimura e Pedro Henrique</h6>


## Referências

> **Arquitetura e Desenho de Software - Aula GoFs Criacinais**. Material de apoio em slides. Milene Serrano.
> **Design Patterns: Padrões “GoF”**. Disponível em :https://www.devmedia.com.br/design-patterns-padroes-gof/16781. Acesso em:24/07/2024
> **Factory Method** Disponível em https://refactoring.guru/pt-br/design-patterns/factory-method. Acesso em 24/07/2024
## Versionamento

| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão |
| :------: | :---: | :-----: | :----: | :----: | :-----: |
| 1.0 | Inicio da estrutura do documento | Pedro Henrique |x | 24/07/2023| x|
| 1.1 | Mais alterações | Pedro Henrique | Guilherme Nishimura | 24/07/2023| 24/07/2023|
| 1.2 | Mais informações e resultado | Guilherme Nishimura | Pedro Henrique | 24/07/2023| 24/07/2023|


95 changes: 95 additions & 0 deletions docs/PadroesDeProjeto/src/Decorator/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// Classe base Product
abstract class Product {
protected double price;
protected String name;

public Product(double price, String name) {
this.price = price;
this.name = name;
}

public double getPrice() {
return price;
}

public String getName() {
return name;
}
}

// Classe Food que herda de Product
class Food extends Product {
public Food(double price, String name) {
super(price, name);
}
}

// Classe Electronics que herda de Product
class Electronics extends Product {
public Electronics(double price, String name) {
super(price, name);
}
}

// Classe abstrata DiscountDecorator que herda de Product
abstract class DiscountDecorator extends Product {
protected Product product;

public DiscountDecorator(Product product) {
super(product.getPrice(), product.getName());
this.product = product;
}

@Override
public abstract double getPrice();
}

// Classe PercentageDiscountDecorator que herda de DiscountDecorator
class PercentageDiscountDecorator extends DiscountDecorator {
private double percentage;

public PercentageDiscountDecorator(Product product, double percentage) {
super(product);
this.percentage = percentage;
}

@Override
public double getPrice() {
return product.getPrice() * (1 - percentage / 100);
}
}

// Classe FixedDiscountDecorator que herda de DiscountDecorator
class FixedDiscountDecorator extends DiscountDecorator {
private double amount;

public FixedDiscountDecorator(Product product, double amount) {
super(product);
this.amount = amount;
}

@Override
public double getPrice() {
return product.getPrice() - amount;
}
}

// Classe principal para testar o código
public class Main {
public static void main(String[] args) {
// Criando produtos
Product banana = new Food(1.0, "Banana");
Product smartwatch = new Electronics(250.0, "Smartwatch");

// Aplicando descontos
Product discountedBanana = new PercentageDiscountDecorator(banana, 10); // 10% de desconto
Product discountedSmartwatch = new FixedDiscountDecorator(smartwatch, 50); // Desconto fixo de $50

// Exibindo preços originais e descontados
System.out.println("Produto: " + banana.getName() + ", Preço Original: $" + banana.getPrice());
System.out.println("Produto: " + discountedBanana.getName() + ", Preço com Desconto: $" + discountedBanana.getPrice());

System.out.println("Produto: " + smartwatch.getName() + ", Preço Original: $" + smartwatch.getPrice());
System.out.println("Produto: " + discountedSmartwatch.getName() + ", Preço com Desconto: $" + discountedSmartwatch.getPrice());
}
}
79 changes: 79 additions & 0 deletions docs/PadroesDeProjeto/src/FactoryMethod/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Classe base Product
abstract class Product {
protected double price;
protected String name;

public double getPrice() {
return price;
}

public String getName() {
return name;
}
}

// Subclasse Food
class Food extends Product {
public Food(double price, String name) {
this.price = price;
this.name = name;
}
}

// Subclasse Eletronics
class Eletronics extends Product {
public Eletronics(double price, String name) {
this.price = price;
this.name = name;
}
}

// Classe abstrata ProductFactory
abstract class ProductFactory {
public abstract Product createProduct();
}

// Subclasse FoodFactory
class FoodFactory extends ProductFactory {
private double price;
private String name;

public FoodFactory(double price, String name) {
this.price = price;
this.name = name;
}

@Override
public Product createProduct() {
return new Food(price, name);
}
}

// Subclasse EletronicsFactory
class EletronicsFactory extends ProductFactory {
private double price;
private String name;

public EletronicsFactory(double price, String name) {
this.price = price;
this.name = name;
}

@Override
public Product createProduct() {
return new Eletronics(price, name);
}
}

// Exemplo de uso
public class Main {
public static void main(String[] args) {
ProductFactory foodFactory = new FoodFactory(10.0, "Banana");
Product food = foodFactory.createProduct();
System.out.println("Product: " + food.getName() + ", Preço: " + food.getPrice());

ProductFactory electronicsFactory = new EletronicsFactory(299.99, "Smartwatch");
Product electronics = electronicsFactory.createProduct();
System.out.println("Product: " + electronics.getName() + ", Preço: " + electronics.getPrice());
}
}
15 changes: 15 additions & 0 deletions docs/PadroesDeProjeto/src/Visitor/DiscountA.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public class DiscountA implements Visitor {
@Override
public void visit(Food food) {
System.out.println("Aplicando 10% de desconto na comida: " + food.getName());
double discountedPrice = food.getPrice() * 0.9;
System.out.println("Preço com desconto: " + discountedPrice);
}

@Override
public void visit(Electronics electronics) {
System.out.println("Aplicando 5% de desconto nos eletronicos: " + electronics.getName());
double discountedPrice = electronics.getPrice() * 0.95;
System.out.println("Preço com desconto: " + discountedPrice);
}
}
15 changes: 15 additions & 0 deletions docs/PadroesDeProjeto/src/Visitor/DiscountB.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public class DiscountB implements Visitor {
@Override
public void visit(Food food) {
System.out.println("Aplicando 15% desconto na comida: " + food.getName());
double discountedPrice = food.getPrice() * 0.85;
System.out.println("Preço com desconto: " + discountedPrice);
}

@Override
public void visit(Electronics electronics) {
System.out.println("Aplicando 10% de desconto nos eletronicos: " + electronics.getName());
double discountedPrice = electronics.getPrice() * 0.9;
System.out.println("Preço com desconto: " + discountedPrice);
}
}
Loading

0 comments on commit 605a3b1

Please sign in to comment.