Question
When you want to charge your iPhone with a type C cable => use an adapter that has a type C hole and a lightning connector.
When you are using data as XML, but want to use a function of a third party library that only accepts JSON as param => use Adapter to convert XML to JSON.
In Android, you have a list item and want to display it on RecyclerView
=> use Adapter to convert data to each item_view
.
Concept
The Adapter pattern allows the interface of an existing class to be used as another interface . It will help the existing class to work with others without changing the source code .
Sounds a bit abstract, doesn’t it? We will slowly go to peel off this confusing outer shell.
However, there are two ways to use adapters: Object Adapter and Class Adapter . We will go through each way in detail.
Object Adapter Pattern
Class diagram
We will implement the interface by delegating to the adaptee object at run-time.
I’ll explain in a little more detail:
- Client is an existing class that I mentioned in the concept section.
- Client Interface is now the parent interface of Client . Other guys who want to communicate with the Client must follow this parent interface.
- Service is a third party guy that only accepts JSON param as I put it.
- Adapter implements Client Interface and contains instance of Service class (object adaptee). Every time it calls the Adapter ‘s method, it will call this Service ‘s method.
- So we can work with the Service guy without editing the code in the Client .
Code sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <span class="token comment">// Client Interface</span> <span class="token keyword">interface</span> <span class="token class-name">TypeCPhone</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">chargeByTypeC</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Interface của Service</span> <span class="token keyword">interface</span> <span class="token class-name">LightningPhone</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">chargeByLightning</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Service</span> <span class="token keyword">class</span> <span class="token class-name">IPhone</span> <span class="token keyword">implements</span> <span class="token class-name">LightningPhone</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">chargeByLightning</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Adapter</span> <span class="token keyword">class</span> <span class="token class-name">TypeCToLightningPhoneAdapter</span> <span class="token keyword">implements</span> <span class="token class-name">TypeCPhone</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">LightningPhone</span> lightningPhone <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token class-name">TypeCToLightningPhoneAdapter</span> <span class="token punctuation">(</span> <span class="token class-name">LightningPhone</span> lightningPhone <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> lightningPhone <span class="token operator">=</span> lightningPhone <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">chargeByTypeC</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> lightningPhone <span class="token punctuation">.</span> <span class="token function">chargeByLightning</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Demo</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">chargeMyXiaomiPhone</span> <span class="token punctuation">(</span> <span class="token class-name">TypeCPhone</span> phone <span class="token punctuation">)</span> <span class="token punctuation">{</span> phone <span class="token punctuation">.</span> <span class="token function">chargeByTypeC</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token class-name">String</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">IPhone</span> iPhone <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">IPhone</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token class-name">TypeCToLightningPhoneAdapter</span> adapter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TypeCToLightningPhoneAdapter</span> <span class="token punctuation">(</span> iPhone <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">chargeMyXiaomiPhone</span> <span class="token punctuation">(</span> adapter <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Class Adapter pattern
Unfortunately Java doesn’t support multiple inheritance so we don’t have a Java code sample for this part.
Conclusion
Adapter is a design pattern quite familiar to us. Through the explanation and a bit of sample code, hope everyone understands more about it.
Reference