From fdc3e1f51e8e0a0733b302351c61885eea6fffc8 Mon Sep 17 00:00:00 2001 From: HKS Date: Sun, 15 Jan 2023 12:33:54 -0500 Subject: [PATCH 1/2] adapter design pattern example, class and object approaches --- .../patterns/adapter/AdapterPatternTest.java | 38 ++++ .../hks/design/patterns/adapter/Socket.java | 7 + .../patterns/adapter/SocketAdapter.java | 7 + .../adapter/SocketClassAdapterImpl.java | 24 +++ .../adapter/SocketObjectAdapterImpl.java | 32 +++ .../com/hks/design/patterns/adapter/Volt.java | 17 ++ .../patterns/adapter/adapter-pattern.md | 182 ++++++++++++++++++ .../playground/static_demo/LoadConfig.java | 8 + .../static_demo/subclass/ExampleDemo.java | 4 + 9 files changed, 319 insertions(+) create mode 100644 src/main/java/com/hks/design/patterns/adapter/AdapterPatternTest.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/Socket.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/SocketAdapter.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/SocketClassAdapterImpl.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/SocketObjectAdapterImpl.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/Volt.java create mode 100644 src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md create mode 100644 src/main/java/com/tutorial/playground/static_demo/LoadConfig.java create mode 100644 src/main/java/com/tutorial/playground/static_demo/subclass/ExampleDemo.java diff --git a/src/main/java/com/hks/design/patterns/adapter/AdapterPatternTest.java b/src/main/java/com/hks/design/patterns/adapter/AdapterPatternTest.java new file mode 100644 index 0000000..f3b7fae --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/AdapterPatternTest.java @@ -0,0 +1,38 @@ +package com.hks.design.patterns.adapter; + +public class AdapterPatternTest { + public static void main(String[] args) { + testClassAdapter(); + testObjectAdapter(); + + } + + private static void testClassAdapter(){ + SocketAdapter socketAdapter = new SocketClassAdapterImpl(); + Volt v3 = getVolt(socketAdapter, 3); + Volt v12 = getVolt(socketAdapter, 12); + Volt v120 = getVolt(socketAdapter, 120); + System.out.println("v3 volts using class adapter="+v3.getVolts()); + System.out.println("v12 volts using class adapter="+v12.getVolts()); + System.out.println("v120 volts using class adapter="+v120.getVolts()); + + } + private static void testObjectAdapter(){ + SocketAdapter socketAdapter = new SocketObjectAdapterImpl(); + Volt v3 = getVolt(socketAdapter, 3); + Volt v12 = getVolt(socketAdapter, 12); + Volt v120 = getVolt(socketAdapter, 120); + System.out.println("v3 volts using object adapter="+v3.getVolts()); + System.out.println("v12 volts using object adapter="+v12.getVolts()); + System.out.println("v120 volts using object adapter="+v120.getVolts()); + } + + private static Volt getVolt(SocketAdapter socketAdapter, int i){ + switch (i){ + case 3: return socketAdapter.get3Volt(); + case 12: return socketAdapter.get12Volt(); + case 120: return socketAdapter.get120Volt(); + default: return socketAdapter.get120Volt(); + } + } +} diff --git a/src/main/java/com/hks/design/patterns/adapter/Socket.java b/src/main/java/com/hks/design/patterns/adapter/Socket.java new file mode 100644 index 0000000..dff4061 --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/Socket.java @@ -0,0 +1,7 @@ +package com.hks.design.patterns.adapter; + +public class Socket { + public Volt getVolts(){ + return new Volt(120); + } +} diff --git a/src/main/java/com/hks/design/patterns/adapter/SocketAdapter.java b/src/main/java/com/hks/design/patterns/adapter/SocketAdapter.java new file mode 100644 index 0000000..bdb692f --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/SocketAdapter.java @@ -0,0 +1,7 @@ +package com.hks.design.patterns.adapter; + +public interface SocketAdapter { + public Volt get120Volt(); + public Volt get12Volt(); + public Volt get3Volt(); +} diff --git a/src/main/java/com/hks/design/patterns/adapter/SocketClassAdapterImpl.java b/src/main/java/com/hks/design/patterns/adapter/SocketClassAdapterImpl.java new file mode 100644 index 0000000..61f4370 --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/SocketClassAdapterImpl.java @@ -0,0 +1,24 @@ +package com.hks.design.patterns.adapter; + +// Using inheritance for adapter pattern +public class SocketClassAdapterImpl extends Socket implements SocketAdapter{ + @Override + public Volt get120Volt() { + return getVolts(); + } + + @Override + public Volt get12Volt() { + Volt v = getVolts(); + return convertVolt(v, 10); + } + + @Override + public Volt get3Volt() { + Volt v = getVolts(); + return convertVolt(v, 40); + } + public Volt convertVolt(Volt v, int i){ + return new Volt(v.getVolts()/i); + } +} diff --git a/src/main/java/com/hks/design/patterns/adapter/SocketObjectAdapterImpl.java b/src/main/java/com/hks/design/patterns/adapter/SocketObjectAdapterImpl.java new file mode 100644 index 0000000..1fc8efc --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/SocketObjectAdapterImpl.java @@ -0,0 +1,32 @@ +package com.hks.design.patterns.adapter; + +public class SocketObjectAdapterImpl implements SocketAdapter{ + //Using composition for Adapter Pattern + private Socket socket ; + public SocketObjectAdapterImpl(){ + socket = new Socket(); + } + public SocketObjectAdapterImpl(Socket s){ + this.socket = s; + } + @Override + public Volt get120Volt() { + return socket.getVolts(); + } + + @Override + public Volt get12Volt() { + Volt v = socket.getVolts(); + return convertVolt(v, 10); + } + + @Override + public Volt get3Volt() { + Volt v = socket.getVolts(); + return convertVolt(v, 40); + } + + public Volt convertVolt(Volt v, int i){ + return new Volt(v.getVolts()/i); + } +} diff --git a/src/main/java/com/hks/design/patterns/adapter/Volt.java b/src/main/java/com/hks/design/patterns/adapter/Volt.java new file mode 100644 index 0000000..39ae120 --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/Volt.java @@ -0,0 +1,17 @@ +package com.hks.design.patterns.adapter; + +public class Volt { + private int volts; + + public Volt(int v){ + this.volts = v; + } + + public int getVolts() { + return volts; + } + + public void setVolts(int volts) { + this.volts = volts; + } +} diff --git a/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md b/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md new file mode 100644 index 0000000..9faf410 --- /dev/null +++ b/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md @@ -0,0 +1,182 @@ +# Adapter Design Pattern + + + +- __structural design pattern__ +- used so that two unrelated interfaces can work together +- object that joins these unrelated interface is called and __Adapter__ + +## Two Way Adapter Pattern +While implementing adapter pattern, there are two approaches - class adapter and object adapter - however both these approaches produce same result. +1. __Class Adaper__ - uses [Java Inheritence](https://www.digitalocean.com/community/tutorials/inheritance-java-example) and extends the source interface. +2. __Object Adapter__ - used [Java Composition](https://www.digitalocean.com/community/tutorials/composition-in-java-example) and adapter contains the source object. + +## Example + +Mobile battery needs 3 volts to charge but the normal socket produces either 120V or 240V. So the __mobile charger__ works as an adapter between mobile charging socket and the wall socket. + +Implement multi-adapter using adapter design pattern. + +1. `Volt` (to measure volts) + +```java +package com.hks.design.patterns.adapter; + +public class Volt { + private int volts; + + public Volt(int v){ + this.volts = v; + } + + public int getVolts() { + return volts; + } + + public void setVolts(int volts) { + this.volts = volts; + } +} + +``` + +2. `Socket` (producing constant volts of 120V) + +```java +package com.hks.design.patterns.adapter; + +public class Socket { + public Volt getVolts(){ + return new Volt(120); + } +} + +``` + +3. interface for the adapter that can produce 3 volts, 12 volts, and default 120 volts. + +```java +package com.hks.design.patterns.adapter; + +public interface SocketAdapter { + public Volt get120Volt(); + public Volt get12Volt(); + public Volt get3Volt(); +} + +``` + +### Adapter Design Pattern - Class Adapter + +```java +package com.hks.design.patterns.adapter; + +// Using inheritance for adapter pattern +public class SocketClassAdapterImpl extends Socket implements SocketAdapter{ + @Override + public Volt get120Volt() { + return getVolts(); + } + + @Override + public Volt get12Volt() { + Volt v = getVolts(); + return convertVolt(v, 10); + } + + @Override + public Volt get3Volt() { + Volt v = getVolts(); + return convertVolt(v, 40); + } + public Volt convertVolt(Volt v, int i){ + return new Volt(v.getVolts()/i); + } +} + +``` + +### Adapter Design Pattern - Object Adapter Implementation + +```java +package com.hks.design.patterns.adapter; + +public class SocketObjectAdapterImpl implements SocketAdapter{ + //Using composition for Adapter Pattern + private Socket socket ; + public SocketObjectAdapterImpl(){ + socket = new Socket(); + } + public SocketObjectAdapterImpl(Socket s){ + this.socket = s; + } + @Override + public Volt get120Volt() { + return socket.getVolts(); + } + + @Override + public Volt get12Volt() { + Volt v = socket.getVolts(); + return convertVolt(v, 10); + } + + @Override + public Volt get3Volt() { + Volt v = socket.getVolts(); + return convertVolt(v, 40); + } + + public Volt convertVolt(Volt v, int i){ + return new Volt(v.getVolts()/i); + } +} + +``` + +- test + +```java +package com.hks.design.patterns.adapter; + +public class AdapterPatternTest { + public static void main(String[] args) { + testClassAdapter(); + testObjectAdapter(); + + } + + private static void testClassAdapter(){ + SocketAdapter socketAdapter = new SocketClassAdapterImpl(); + Volt v3 = getVolt(socketAdapter, 3); + Volt v12 = getVolt(socketAdapter, 12); + Volt v120 = getVolt(socketAdapter, 120); + System.out.println("v3 volts using class adapter="+v3.getVolts()); + System.out.println("v12 volts using class adapter="+v12.getVolts()); + System.out.println("v120 volts using class adapter="+v120.getVolts()); + + } + private static void testObjectAdapter(){ + SocketAdapter socketAdapter = new SocketObjectAdapterImpl(); + Volt v3 = getVolt(socketAdapter, 3); + Volt v12 = getVolt(socketAdapter, 12); + Volt v120 = getVolt(socketAdapter, 120); + System.out.println("v3 volts using object adapter="+v3.getVolts()); + System.out.println("v12 volts using object adapter="+v12.getVolts()); + System.out.println("v120 volts using object adapter="+v120.getVolts()); + } + + private static Volt getVolt(SocketAdapter socketAdapter, int i){ + switch (i){ + case 3: return socketAdapter.get3Volt(); + case 12: return socketAdapter.get12Volt(); + case 120: return socketAdapter.get120Volt(); + default: return socketAdapter.get120Volt(); + } + } +} + +``` + +## Class Diagram + diff --git a/src/main/java/com/tutorial/playground/static_demo/LoadConfig.java b/src/main/java/com/tutorial/playground/static_demo/LoadConfig.java new file mode 100644 index 0000000..e73abb5 --- /dev/null +++ b/src/main/java/com/tutorial/playground/static_demo/LoadConfig.java @@ -0,0 +1,8 @@ +package com.tutorial.playground.static_demo; + +public class LoadConfig { + + private static void loadConfig(String str){ + System.out.println("configuration loaded"); + } +} diff --git a/src/main/java/com/tutorial/playground/static_demo/subclass/ExampleDemo.java b/src/main/java/com/tutorial/playground/static_demo/subclass/ExampleDemo.java new file mode 100644 index 0000000..308f4eb --- /dev/null +++ b/src/main/java/com/tutorial/playground/static_demo/subclass/ExampleDemo.java @@ -0,0 +1,4 @@ +package com.tutorial.playground.static_demo.subclass; + +public class ExampleDemo { +} From cde58c3420a98a8b0ff263139f259debcec2e000 Mon Sep 17 00:00:00 2001 From: hks1 Date: Sun, 15 Jan 2023 12:54:29 -0500 Subject: [PATCH 2/2] Update adapter-pattern.md --- .../patterns/adapter/adapter-pattern.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md b/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md index 9faf410..6a156f9 100644 --- a/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md +++ b/src/main/java/com/hks/design/patterns/adapter/adapter-pattern.md @@ -180,3 +180,42 @@ public class AdapterPatternTest { ## Class Diagram +```mermaid +classDiagram +Socket <|-- SocketClassAdapterImpl +Socket "-sock 0..1" <-- SocketObjectAdapterImpl +SocketAdapter <|.. SocketClassAdapterImpl +SocketAdapter <|.. SocketObjectAdapterImpl +class Socket{ +<> ++Socket() ++getVolt() Volt +} +class SocketAdapter{ +<> ++get3Volt() Volt ++get12Volt() Volt ++get120Volt() Volt +} +class SocketClassAdapterImpl{ +<> ++SocketClassAdapterImpl() ++get3Volt() Volt ++get12Volt() Volt ++get120Volt() Volt +-convertVolt(Volt, int) Volt +} +class SocketObjectAdapterImpl{ +<> ++SocketObjectAdapterImpl() ++get3Volt() Volt ++get12Volt() Volt ++get120Volt() Volt +-convertVolt(Volt, int) Volt +} +``` + +## Adapter Design Pattern Example in JDK +- java.util.Arrays#asList() +- java.io.InputStreamReader(InputStream) (returns a Reader) +- java.io.OutputSreamWriter(OutputStream) {returns a Writer)