generated from UnBArqDsw2024-1/RepositoryTemplate
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #29 from UnBArqDsw2024-1/main
Atualiza branch
- Loading branch information
Showing
12 changed files
with
581 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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| | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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| | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
Oops, something went wrong.