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