diff --git a/docs/PadroesDeProjeto/Composite.md b/docs/PadroesDeProjeto/Composite.md new file mode 100644 index 0000000..e53373c --- /dev/null +++ b/docs/PadroesDeProjeto/Composite.md @@ -0,0 +1,127 @@ +# Composite - GoF Comportamental + +## 1. Introdução +O padrão de projeto Composite é um padrão estrutural que permite a composição de objetos em estruturas de árvore para representar hierarquias parte-todo. Ele trata objetos individuais e composições de objetos de maneira uniforme, simplificando o design de sistemas que precisam manipular uma coleção de objetos de forma hierárquica. O Composite é especialmente útil em situações onde você quer que o cliente interaja com objetos simples e compostos de maneira idêntica. + + +## 2. Objetivo +O principal objetivo do padrão Composite é permitir que os clientes tratem objetos individuais e composições de objetos de maneira uniforme. Isso é alcançado ao definir uma interface comum para todos os objetos na composição. O padrão facilita a adição de novos tipos de componentes, já que o cliente não precisa se preocupar se está manipulando um objeto simples ou uma composição complexa. Esse padrão promove um design mais flexível e escalável, reduzindo a complexidade do código e melhorando a manutenibilidade do sistema. + + +## 3. Implementação + + + +### 3.1. Diagrama UML + + + + +
Figura 01 Fonte: Artur Rodrigues Sousa Alves e João Víctor Costa Andrade
+ +### 3.2. Código +```java +import java.util.ArrayList; +import java.util.List; + +// Interface Componente +abstract class HoraTrabalhada { + protected String nome; + + public HoraTrabalhada(String nome) { + this.nome = nome; + } + + public String getNome() { + return nome; + } + + public abstract int getHoraTrabalhada(); + + public void add(HoraTrabalhada horaTrabalhada) { + throw new UnsupportedOperationException(); + } + + public void remove(HoraTrabalhada horaTrabalhada) { + throw new UnsupportedOperationException(); + } +} + +// Folha: Funcionario +class Funcionario extends HoraTrabalhada { + private int horas; + + public Funcionario(String nome, int horas) { + super(nome); + this.horas = horas; + } + + @Override + public int getHoraTrabalhada() { + return horas; + } +} + +// Composto: Organizacao +class Organizacao extends HoraTrabalhada { + private List departamentos = new ArrayList<>(); + + public Organizacao(String nome) { + super(nome); + } + + @Override + public void add(HoraTrabalhada horaTrabalhada) { + departamentos.add(horaTrabalhada); + } + + @Override + public void remove(HoraTrabalhada horaTrabalhada) { + departamentos.remove(horaTrabalhada); + } + + @Override + public int getHoraTrabalhada() { + int totalHoras = 0; + for (HoraTrabalhada horaTrabalhada : departamentos) { + totalHoras += horaTrabalhada.getHoraTrabalhada(); + } + return totalHoras; + } +} + +// Cliente +public class Program { + public static void main(String[] args) { + Funcionario func1 = new Funcionario("Funcionario 1", 40); + Funcionario func2 = new Funcionario("Funcionario 2", 35); + Funcionario func3 = new Funcionario("Funcionario 3", 30); + + Organizacao departamento1 = new Organizacao("Departamento 1"); + departamento1.add(func1); + departamento1.add(func2); + + Organizacao departamento2 = new Organizacao("Departamento 2"); + departamento2.add(func3); + + Organizacao empresa = new Organizacao("Empresa"); + empresa.add(departamento1); + empresa.add(departamento2); + + System.out.println("Horas trabalhadas no " + departamento1.getNome() + ": " + departamento1.getHoraTrabalhada()); + System.out.println("Horas trabalhadas no " + departamento2.getNome() + ": " + departamento2.getHoraTrabalhada()); + System.out.println("Horas trabalhadas na " + empresa.getNome() + ": " + empresa.getHoraTrabalhada()); + } +} +``` + +## 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 | Criação do documento | [João Costa](https://github.com/jvcostta) | [Artur Rodrigues](https://github.com/ArturRSA19)| 22/07/2024 | 22/07/2024 | +| 1.2 | Adicionando codigo | [João Costa](https://github.com/jvcostta) | [Artur Rodrigues](https://github.com/ArturRSA19)| 22/07/2024 | 22/07/2024 | +| 1.3 | Adicionando imagem e finalizando documento | [João Costa](https://github.com/jvcostta) | [Artur Rodrigues](https://github.com/ArturRSA19)| 22/07/2024 | 22/07/2024 | diff --git a/docs/PadroesDeProjeto/Prototype.md b/docs/PadroesDeProjeto/Prototype.md new file mode 100644 index 0000000..270816f --- /dev/null +++ b/docs/PadroesDeProjeto/Prototype.md @@ -0,0 +1,95 @@ +# Prototype - GoF Criacional + +## 1. Introdução + +O Prototype é um padrão de projeto criacional que permite copiar objetos existentes sem fazer seu código ficar dependente de suas classes. + +## 2. Objetivo + +O padrão Prototype delega o processo de clonagem para o próprio objeto que está sendo clonado. O padrão declara um interface comum para todos os objetos que suportam clonagem. Essa interface permite que você clone um objeto sem acoplar seu código à classe daquele objeto. Geralmente, tal interface contém apenas um único método clonar. + +## 3. Implementação + + + +### 3.1. Diagrama UML +Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). + +![image](https://github.com/user-attachments/assets/953c1118-bf4e-48f6-9160-52f05701f21b) + + +
Figura 01 Fonte: Artur Rodrigues Sousa Alves e João Víctor Costa Andrade
+ +### 3.2. Código + +```java +public interface Prototype { + String getColor(); + Prototype clone(); +} + +public class Button implements Prototype { + private int x; + private int y; + private String color; + + public Button(int x, int y, String color) { + this.x = x; + this.y = y; + this.color = color; + } + + public Button(Button prototype) { + if (prototype != null) { + this.x = prototype.x; + this.y = prototype.y; + this.color = prototype.color; + } + } + + @Override + public String getColor() { + return this.color; + } + + @Override + public Prototype clone() { + return new Button(this); + } + + @Override + public String toString() { + return "Button [x=" + x + ", y=" + y + ", color=" + color + "]"; + } +} + +public class Client { + public static void main(String[] args) { + PrototypeRegistry registry = new PrototypeRegistry(); + + // Adicionando protótipo ao registro + Button landingButton = new Button(10, 40, "red"); + registry.addItem("LandingButton", landingButton); + + // Clonando protótipo pelo ID + Button buttonById = (Button) registry.getById("LandingButton"); + System.out.println(buttonById); + + // Clonando protótipo pela cor + Button buttonByColor = (Button) registry.getByColor("red"); + System.out.println(buttonByColor); + } +} +``` + + +## 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 | Criação do documento | [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 | +| 1.1 | Adicionando código | [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 | +| 1.2 | Finalizando documento| [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 | diff --git a/docs/PadroesDeProjeto/Strategy.md b/docs/PadroesDeProjeto/Strategy.md new file mode 100644 index 0000000..dd9bfe0 --- /dev/null +++ b/docs/PadroesDeProjeto/Strategy.md @@ -0,0 +1,108 @@ +# Strategy - GoF Comportamental + +## 1. Introdução + +O padrão de projeto Strategy é um dos 23 padrões de design documentados pelos "Gang of Four" (GoF) no livro "Design Patterns: Elements of Reusable Object-Oriented Software". Este padrão é categorizado como um padrão comportamental, que lida com a responsabilidade e a comunicação entre objetos. + +O padrão Strategy permite definir uma família de algoritmos, encapsular cada um deles em uma classe separada e torná-los intercambiáveis. O Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam. Isso facilita a manutenção e a extensão do código, pois novas estratégias podem ser introduzidas sem modificar as existentes. + +## 2. Objetivo + +O principal objetivo do padrão Strategy é permitir que diferentes algoritmos sejam selecionados e aplicados em tempo de execução sem que o cliente precise conhecer os detalhes de implementação dos algoritmos. Ele visa resolver problemas relacionados à variação do comportamento de uma aplicação, onde um algoritmo específico precisa ser escolhido dentre vários disponíveis. + +Os principais benefícios do padrão Strategy incluem: + +Encapsulamento de Algoritmos: Cada algoritmo é encapsulado em sua própria classe, promovendo a separação de responsabilidades e facilitando a manutenção e a compreensão do código. + +Intercambiabilidade: Algoritmos podem ser alterados ou substituídos sem modificar o código do cliente que os utiliza. Isso proporciona grande flexibilidade e extensibilidade ao sistema. + +Isolamento de Código Complexo: Complexidade do algoritmo fica isolada em classes específicas, reduzindo a complexidade do código do cliente. + +## 3. Implementação + + + +### 3.1. Diagrama UML +Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). + +![image](https://github.com/user-attachments/assets/0acdd8d7-5962-4e8e-badb-8d1c38e0b535) + + +
Figura 01 Fonte: Artur Rodrigues Sousa Alves e João Víctor Costa Andrade
+ +### 3.2. Código + +```java +// Interface da Estratégia +interface EstrategiaPagamento { + void processarPagamento(double valor); +} + +// Estratégia Concreta: Pagamento com Cartão de Crédito +class PagamentoCartaoCredito implements EstrategiaPagamento { + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento de R$" + valor + " via Cartão de Crédito."); + } +} + +// Estratégia Concreta: Pagamento com PayPal +class PagamentoPayPal implements EstrategiaPagamento { + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento de R$" + valor + " via PayPal."); + } +} + +// Estratégia Concreta: Pagamento com Transferência Bancária +class PagamentoTransferenciaBancaria implements EstrategiaPagamento { + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento de R$" + valor + " via Transferência Bancária."); + } +} + +// Contexto +class Pagamento { + private EstrategiaPagamento estrategia; + + public void setEstrategia(EstrategiaPagamento estrategia) { + this.estrategia = estrategia; + } + + public void processarPagamento(double valor) { + this.estrategia.processarPagamento(valor); + } +} + +// Cliente +public class Main { + public static void main(String[] args) { + Pagamento pagamento = new Pagamento(); + + // Pagamento via Cartão de Crédito + pagamento.setEstrategia(new PagamentoCartaoCredito()); + pagamento.processarPagamento(100.0); + + // Pagamento via PayPal + pagamento.setEstrategia(new PagamentoPayPal()); + pagamento.processarPagamento(200.0); + + // Pagamento via Transferência Bancária + pagamento.setEstrategia(new PagamentoTransferenciaBancaria()); + pagamento.processarPagamento(300.0); + } +} +``` + + +## 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 | Criação do documento | [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 | +| 1.1 | Adicionando código | [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 | +| 1.2 | Finalizando documento | [Artur Rodrigues](https://github.com/ArturRSA19)| [João Costa](https://github.com/jvcostta) | 22/07/2024 | 22/07/2024 |