Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .project
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,15 @@
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
<filteredResources>
<filter>
<id>1772133157447</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
55 changes: 55 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,58 @@ Repositório com as implementações dos padrões de projeto explorados no Lab "
- Singleton
- Strategy
- Facade

---------------------------------------------------------------------------------------------

Para o desafio, foi incluído o padrão Java puro **Observer**, trazendo uma evolução ao projeto:

**Observer**: foi implementado para que o robô notifique automaticamente seus observadores sempre que executa uma ação de movimento.

Isso permite desacoplar a lógica de execução (robô) da lógica de reação (observadores).

Exemplo de saída no console: ``` Notificação: O robô executou a ação -> Movendo-se normalmente... Notificação: O robô executou a ação -> Movendo-se defensivamente... Notificação: O robô executou a ação -> Movendo-se agressivamente... ```

## Diagrama UML (Observer + Strategy)

O diagrama abaixo mostra como o padrão Observer foi integrado ao projeto, em conjunto com o Strategy:

+-------------------+
| Observer |
+-------------------+
| + update(acao) |
+-------------------+
^
|
+-------------------+
| ConsoleObserver |
+-------------------+
| + update(acao) |
+-------------------+

+-------------------+
| Robo |
+-------------------+
| - comportamento |
| - observers[] |
+-------------------+
| + setComportamento|
| + mover() |
| + addObserver() |
| - notifyObservers |
+-------------------+
|
v
+-------------------+
| Comportamento |
+-------------------+
| + mover() |
+-------------------+
^
-----------------------------------
| | |
+----------------+ +----------------+ +----------------+
|Comportamento | |Comportamento | |Comportamento |
|Normal | |Defensivo | |Agressivo |
+----------------+ +----------------+ +----------------+
| + mover() | | + mover() | | + mover() |
+----------------+ +----------------+ +----------------+
86 changes: 44 additions & 42 deletions src/one/digitalinnovation/gof/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,49 +9,51 @@
import one.digitalinnovation.gof.strategy.ComportamentoDefensivo;
import one.digitalinnovation.gof.strategy.ComportamentoNormal;
import one.digitalinnovation.gof.strategy.Robo;
import one.digitalinnovation.gof.observer.ConsoleObserver;

public class Test {

public static void main(String[] args) {

// Singleton

SingletonLazy lazy = SingletonLazy.getInstancia();
System.out.println(lazy);
lazy = SingletonLazy.getInstancia();
System.out.println(lazy);

SingletonEager eager = SingletonEager.getInstancia();
System.out.println(eager);
eager = SingletonEager.getInstancia();
System.out.println(eager);

SingletonLazyHolder lazyHolder = SingletonLazyHolder.getInstancia();
System.out.println(lazyHolder);
lazyHolder = SingletonLazyHolder.getInstancia();
System.out.println(lazyHolder);

// Strategy

Comportamento defensivo = new ComportamentoDefensivo();
Comportamento normal = new ComportamentoNormal();
Comportamento agressivo = new ComportamentoAgressivo();

Robo robo = new Robo();
robo.setComportamento(normal);
robo.mover();
robo.mover();
robo.setComportamento(defensivo);
robo.mover();
robo.setComportamento(agressivo);
robo.mover();
robo.mover();
robo.mover();

// Facade

Facade facade = new Facade();
facade.migrarCliente("Venilton", "14801788");
}
public static void main(String[] args) {

// Singleton
SingletonLazy lazy = SingletonLazy.getInstancia();
System.out.println(lazy);
lazy = SingletonLazy.getInstancia();
System.out.println(lazy);

SingletonEager eager = SingletonEager.getInstancia();
System.out.println(eager);
eager = SingletonEager.getInstancia();
System.out.println(eager);

SingletonLazyHolder lazyHolder = SingletonLazyHolder.getInstancia();
System.out.println(lazyHolder);
lazyHolder = SingletonLazyHolder.getInstancia();
System.out.println(lazyHolder);

// Strategy + Observer
Comportamento defensivo = new ComportamentoDefensivo();
Comportamento normal = new ComportamentoNormal();
Comportamento agressivo = new ComportamentoAgressivo();

Robo robo = new Robo();
// adicionando um observador
robo.addObserver(new ConsoleObserver());

}
robo.setComportamento(normal);
robo.mover();
robo.mover();

robo.setComportamento(defensivo);
robo.mover();

robo.setComportamento(agressivo);
robo.mover();
robo.mover();
robo.mover();

// Facade
Facade facade = new Facade();
facade.migrarCliente("Venilton", "14801788");
}
}
8 changes: 8 additions & 0 deletions src/one/digitalinnovation/gof/observer/ConsoleObserver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package one.digitalinnovation.gof.observer;

public class ConsoleObserver implements Observer {
@Override
public void update(String acao) {
System.out.println("Notificação: O robô executou a ação -> " + acao);
}
}
5 changes: 5 additions & 0 deletions src/one/digitalinnovation/gof/observer/Observer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package one.digitalinnovation.gof.observer;

public interface Observer {
void update(String acao);
}
2 changes: 1 addition & 1 deletion src/one/digitalinnovation/gof/strategy/Comportamento.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package one.digitalinnovation.gof.strategy;

public interface Comportamento {
void mover();
String mover();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

public class ComportamentoAgressivo implements Comportamento {

@Override
public void mover() {
System.out.println("Movendo-se agressivamente...");
}

@Override
public String mover() {
return "Movendo-se agressivamente...";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

public class ComportamentoDefensivo implements Comportamento {

@Override
public void mover() {
System.out.println("Movendo-se defensivamente...");
}

@Override
public String mover() {
return "Movendo-se defensivamente...";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

public class ComportamentoNormal implements Comportamento {

@Override
public void mover() {
System.out.println("Movendo-se normalmente...");
}

@Override
public String mover() {
return "Movendo-se normalmente...";
}
}
38 changes: 27 additions & 11 deletions src/one/digitalinnovation/gof/strategy/Robo.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,30 @@
package one.digitalinnovation.gof.strategy;

import one.digitalinnovation.gof.observer.Observer;
import java.util.ArrayList;
import java.util.List;

public class Robo {

private Comportamento comportamento;

public void setComportamento(Comportamento comportamento) {
this.comportamento = comportamento;
}

public void mover() {
comportamento.mover();
}
}

private Comportamento comportamento;
private List<Observer> observers = new ArrayList<>();

public void setComportamento(Comportamento comportamento) {
this.comportamento = comportamento;
}

public void mover() {
String acao = comportamento.mover();
notifyObservers(acao);
}

public void addObserver(Observer observer) {
observers.add(observer);
}

private void notifyObservers(String acao) {
for (Observer obs : observers) {
obs.update(acao);
}
}
}