diff --git a/.project b/.project
index 9a1e28a..bc04736 100644
--- a/.project
+++ b/.project
@@ -14,4 +14,15 @@
org.eclipse.jdt.core.javanature
+
+
+ 1772133157447
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/README.md b/README.md
index 0940254..cad9ea0 100644
--- a/README.md
+++ b/README.md
@@ -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() |
++----------------+ +----------------+ +----------------+
diff --git a/src/one/digitalinnovation/gof/Test.java b/src/one/digitalinnovation/gof/Test.java
index 1d413b9..ae68e68 100644
--- a/src/one/digitalinnovation/gof/Test.java
+++ b/src/one/digitalinnovation/gof/Test.java
@@ -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");
+ }
+}
\ No newline at end of file
diff --git a/src/one/digitalinnovation/gof/observer/ConsoleObserver.java b/src/one/digitalinnovation/gof/observer/ConsoleObserver.java
new file mode 100644
index 0000000..8fc4335
--- /dev/null
+++ b/src/one/digitalinnovation/gof/observer/ConsoleObserver.java
@@ -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);
+ }
+}
diff --git a/src/one/digitalinnovation/gof/observer/Observer.java b/src/one/digitalinnovation/gof/observer/Observer.java
new file mode 100644
index 0000000..e468847
--- /dev/null
+++ b/src/one/digitalinnovation/gof/observer/Observer.java
@@ -0,0 +1,5 @@
+package one.digitalinnovation.gof.observer;
+
+public interface Observer {
+ void update(String acao);
+}
\ No newline at end of file
diff --git a/src/one/digitalinnovation/gof/strategy/Comportamento.java b/src/one/digitalinnovation/gof/strategy/Comportamento.java
index 98ac3b1..922a4f6 100644
--- a/src/one/digitalinnovation/gof/strategy/Comportamento.java
+++ b/src/one/digitalinnovation/gof/strategy/Comportamento.java
@@ -1,5 +1,5 @@
package one.digitalinnovation.gof.strategy;
public interface Comportamento {
- void mover();
+ String mover();
}
diff --git a/src/one/digitalinnovation/gof/strategy/ComportamentoAgressivo.java b/src/one/digitalinnovation/gof/strategy/ComportamentoAgressivo.java
index 5e6532f..3e85e01 100644
--- a/src/one/digitalinnovation/gof/strategy/ComportamentoAgressivo.java
+++ b/src/one/digitalinnovation/gof/strategy/ComportamentoAgressivo.java
@@ -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...";
+ }
}
diff --git a/src/one/digitalinnovation/gof/strategy/ComportamentoDefensivo.java b/src/one/digitalinnovation/gof/strategy/ComportamentoDefensivo.java
index 8ed1fbe..5b6b4fa 100644
--- a/src/one/digitalinnovation/gof/strategy/ComportamentoDefensivo.java
+++ b/src/one/digitalinnovation/gof/strategy/ComportamentoDefensivo.java
@@ -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...";
+ }
}
diff --git a/src/one/digitalinnovation/gof/strategy/ComportamentoNormal.java b/src/one/digitalinnovation/gof/strategy/ComportamentoNormal.java
index 1eb507e..87ff84a 100644
--- a/src/one/digitalinnovation/gof/strategy/ComportamentoNormal.java
+++ b/src/one/digitalinnovation/gof/strategy/ComportamentoNormal.java
@@ -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...";
+ }
}
diff --git a/src/one/digitalinnovation/gof/strategy/Robo.java b/src/one/digitalinnovation/gof/strategy/Robo.java
index b37f1fb..a5b32ca 100644
--- a/src/one/digitalinnovation/gof/strategy/Robo.java
+++ b/src/one/digitalinnovation/gof/strategy/Robo.java
@@ -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 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);
+ }
+ }
+}
\ No newline at end of file