From e88c5776c8733daabc1c5b8e5f93845bca329462 Mon Sep 17 00:00:00 2001 From: Luis Date: Mon, 16 Jun 2025 10:30:01 -0300 Subject: [PATCH] Add Adapter and Decorator pattern examples --- README.md | 3 +++ .../example/constructs/adapter/Adaptee.java | 7 ++++++ .../example/constructs/adapter/Adapter.java | 14 +++++++++++ .../adapter/AdapterExampleRunner.java | 23 +++++++++++++++++ .../example/constructs/adapter/Target.java | 5 ++++ .../constructs/decorator/ComponentIF.java | 5 ++++ .../decorator/ConcreteComponent.java | 8 ++++++ .../decorator/ConcreteDecoratorA.java | 13 ++++++++++ .../constructs/decorator/Decorator.java | 9 +++++++ .../decorator/DecoratorExampleRunner.java | 25 +++++++++++++++++++ .../adapter/AdapterExampleRunnerTests.java | 10 ++++++++ .../DecoratorExampleRunnerTests.java | 10 ++++++++ 12 files changed, 132 insertions(+) create mode 100644 src/main/java/com/penapereira/example/constructs/adapter/Adaptee.java create mode 100644 src/main/java/com/penapereira/example/constructs/adapter/Adapter.java create mode 100644 src/main/java/com/penapereira/example/constructs/adapter/AdapterExampleRunner.java create mode 100644 src/main/java/com/penapereira/example/constructs/adapter/Target.java create mode 100644 src/main/java/com/penapereira/example/constructs/decorator/ComponentIF.java create mode 100644 src/main/java/com/penapereira/example/constructs/decorator/ConcreteComponent.java create mode 100644 src/main/java/com/penapereira/example/constructs/decorator/ConcreteDecoratorA.java create mode 100644 src/main/java/com/penapereira/example/constructs/decorator/Decorator.java create mode 100644 src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java create mode 100644 src/test/java/com/penapereira/example/constructs/adapter/AdapterExampleRunnerTests.java create mode 100644 src/test/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunnerTests.java diff --git a/README.md b/README.md index 2ebd480..d046e0c 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,13 @@ cd java-patterns-and-constructs ## Da List ### Patterns * [Abstract Factory](src/main/java/com/penapereira/example/constructs/abstractfactory/) +* [Adapter](src/main/java/com/penapereira/example/constructs/adapter/) +* [Decorator](src/main/java/com/penapereira/example/constructs/decorator/) * [Factory](src/main/java/com/penapereira/example/constructs/factory/) * [Factory Method](src/main/java/com/penapereira/example/constructs/factorymethod/) * [Observer](src/main/java/com/penapereira/example/constructs/observer/) * [Singleton](src/main/java/com/penapereira/example/constructs/singleton/) +* [Strategy](src/main/java/com/penapereira/example/constructs/strategy/) * [Template Method](src/main/java/com/penapereira/example/constructs/templatemethod/) ### Constructs and Problems * [Producer/Consumer](src/main/java/com/penapereira/example/constructs/producerconsumer/), a multi-process synchronization problem. diff --git a/src/main/java/com/penapereira/example/constructs/adapter/Adaptee.java b/src/main/java/com/penapereira/example/constructs/adapter/Adaptee.java new file mode 100644 index 0000000..93a76be --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/adapter/Adaptee.java @@ -0,0 +1,7 @@ +package com.penapereira.example.constructs.adapter; + +public class Adaptee { + public String specificRequest() { + return "Adaptee"; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/adapter/Adapter.java b/src/main/java/com/penapereira/example/constructs/adapter/Adapter.java new file mode 100644 index 0000000..fd50fa2 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/adapter/Adapter.java @@ -0,0 +1,14 @@ +package com.penapereira.example.constructs.adapter; + +public class Adapter implements Target { + private final Adaptee adaptee; + + public Adapter(Adaptee adaptee) { + this.adaptee = adaptee; + } + + @Override + public String request() { + return "Adapter(" + adaptee.specificRequest() + ")"; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/adapter/AdapterExampleRunner.java b/src/main/java/com/penapereira/example/constructs/adapter/AdapterExampleRunner.java new file mode 100644 index 0000000..5ab0436 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/adapter/AdapterExampleRunner.java @@ -0,0 +1,23 @@ +package com.penapereira.example.constructs.adapter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.penapereira.example.constructs.app.ExampleRunnerInterface; + +@Component +public class AdapterExampleRunner implements ExampleRunnerInterface { + + private static final Logger log = LoggerFactory.getLogger(AdapterExampleRunner.class); + + @Override + public void runExample() throws Exception { + log.trace("Executing Adapter Pattern Implementation"); + + Adaptee adaptee = new Adaptee(); + Target target = new Adapter(adaptee); + + log.trace(" " + target.request()); + } +} diff --git a/src/main/java/com/penapereira/example/constructs/adapter/Target.java b/src/main/java/com/penapereira/example/constructs/adapter/Target.java new file mode 100644 index 0000000..8943acd --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/adapter/Target.java @@ -0,0 +1,5 @@ +package com.penapereira.example.constructs.adapter; + +public interface Target { + String request(); +} diff --git a/src/main/java/com/penapereira/example/constructs/decorator/ComponentIF.java b/src/main/java/com/penapereira/example/constructs/decorator/ComponentIF.java new file mode 100644 index 0000000..c8822bd --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/decorator/ComponentIF.java @@ -0,0 +1,5 @@ +package com.penapereira.example.constructs.decorator; + +public interface ComponentIF { + String operation(); +} diff --git a/src/main/java/com/penapereira/example/constructs/decorator/ConcreteComponent.java b/src/main/java/com/penapereira/example/constructs/decorator/ConcreteComponent.java new file mode 100644 index 0000000..b2f5988 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/decorator/ConcreteComponent.java @@ -0,0 +1,8 @@ +package com.penapereira.example.constructs.decorator; + +public class ConcreteComponent implements ComponentIF { + @Override + public String operation() { + return "ConcreteComponent"; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/decorator/ConcreteDecoratorA.java b/src/main/java/com/penapereira/example/constructs/decorator/ConcreteDecoratorA.java new file mode 100644 index 0000000..df27b9c --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/decorator/ConcreteDecoratorA.java @@ -0,0 +1,13 @@ +package com.penapereira.example.constructs.decorator; + +public class ConcreteDecoratorA extends Decorator { + + public ConcreteDecoratorA(ComponentIF component) { + super(component); + } + + @Override + public String operation() { + return "ConcreteDecoratorA(" + component.operation() + ")"; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/decorator/Decorator.java b/src/main/java/com/penapereira/example/constructs/decorator/Decorator.java new file mode 100644 index 0000000..0236227 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/decorator/Decorator.java @@ -0,0 +1,9 @@ +package com.penapereira.example.constructs.decorator; + +public abstract class Decorator implements ComponentIF { + protected final ComponentIF component; + + protected Decorator(ComponentIF component) { + this.component = component; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java b/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java new file mode 100644 index 0000000..9316a9e --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java @@ -0,0 +1,25 @@ +package com.penapereira.example.constructs.decorator; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.penapereira.example.constructs.app.ExampleRunnerInterface; + +import com.penapereira.example.constructs.decorator.ComponentIF; + +@Component +public class DecoratorExampleRunner implements ExampleRunnerInterface { + + private static final Logger log = LoggerFactory.getLogger(DecoratorExampleRunner.class); + + @Override + public void runExample() throws Exception { + log.trace("Executing Decorator Pattern Implementation"); + + ComponentIF component = new ConcreteComponent(); + ComponentIF decorated = new ConcreteDecoratorA(component); + + log.trace(" " + decorated.operation()); + } +} diff --git a/src/test/java/com/penapereira/example/constructs/adapter/AdapterExampleRunnerTests.java b/src/test/java/com/penapereira/example/constructs/adapter/AdapterExampleRunnerTests.java new file mode 100644 index 0000000..58e73d2 --- /dev/null +++ b/src/test/java/com/penapereira/example/constructs/adapter/AdapterExampleRunnerTests.java @@ -0,0 +1,10 @@ +package com.penapereira.example.constructs.adapter; + +import org.junit.jupiter.api.Test; + +class AdapterExampleRunnerTests { + @Test + void runExampleRuns() throws Exception { + new AdapterExampleRunner().runExample(); + } +} diff --git a/src/test/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunnerTests.java b/src/test/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunnerTests.java new file mode 100644 index 0000000..675a8f0 --- /dev/null +++ b/src/test/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunnerTests.java @@ -0,0 +1,10 @@ +package com.penapereira.example.constructs.decorator; + +import org.junit.jupiter.api.Test; + +class DecoratorExampleRunnerTests { + @Test + void runExampleRuns() throws Exception { + new DecoratorExampleRunner().runExample(); + } +}