Adapter Pattern
AP được sử dụng với mục đích giúp cho 2 giao diện (interface) độc lập có thể làm việc được với nhau. Đối tượng kết nối những interface độc lập này lại được gọi là adapter. Một ví dụ giúp dễ hình dung cách thức hoạt động của adapter là: chúng ta có thể xem bộ sạc di động như là một adapter. Bởi vì nó giúp chuyển dòng điện 120v (hay 220V) vào pin của điện thoại. Trong khi pin điện thoại lại chỉ yêu cầu dòng điện 3V. Như vậy adapter kết nối giữa cổng cắm pin điện thoại và cổng cắm điện trên tường.
Đoạn mã lệnh sau giúp minh họa ví dụ trên của Adapter pattern.
Lớp Volt dùng để đo volt
package com.journaldev.design.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; } }
Lớp Socket dùng để tạo ra dòng điện với hằng số Volt là 120V
package com.journaldev.design.adapter; public class Socket { public Volt getVolt(){ return new Volt(120); } }
Bây giờ chúng ta xây dựng một adapter có thể tạo ra 3V, 12V và 120V (mặc định). Một interface được tạo ra để đáp ứng yêu cầu này.
package com.journaldev.design.adapter; public interface SocketAdapter { public Volt get120Volt(); public Volt get12Volt(); public Volt get3Volt(); }
1. Hình thức 1 của AP - Class Adapter
package com.journaldev.design.adapter; //Using inheritance for adapter pattern public class SocketClassAdapterImpl extends Socket implements SocketAdapter{ @Override public Volt get120Volt() { return getVolt(); } @Override public Volt get12Volt() { Volt v= getVolt(); return convertVolt(v,10); } @Override public Volt get3Volt() { Volt v= getVolt(); return convertVolt(v,40); } private Volt convertVolt(Volt v, int i) { return new Volt(v.getVolts()/i); } }
2. Hình thức thứ 2 của AP - Object Adapter Implementation
package com.journaldev.design.adapter; public class SocketObjectAdapterImpl implements SocketAdapter{ //Using Composition for adapter pattern private Socket sock = new Socket(); @Override public Volt get120Volt() { return sock.getVolt(); } @Override public Volt get12Volt() { Volt v= sock.getVolt(); return convertVolt(v,10); } @Override public Volt get3Volt() { Volt v= sock.getVolt(); return convertVolt(v,40); } private Volt convertVolt(Volt v, int i) { return new Volt(v.getVolts()/i); } }
3. Chương trình sử dụng Adapter pattern
package com.journaldev.design.test; import com.journaldev.design.adapter.SocketAdapter; import com.journaldev.design.adapter.SocketClassAdapterImpl; import com.journaldev.design.adapter.SocketObjectAdapterImpl; import com.journaldev.design.adapter.Volt; public class AdapterPatternTest { public static void main(String[] args) { testClassAdapter(); testObjectAdapter(); } private static void testObjectAdapter() { SocketAdapter sockAdapter = new SocketObjectAdapterImpl(); Volt v3 = getVolt(sockAdapter,3); Volt v12 = getVolt(sockAdapter,12); Volt v120 = getVolt(sockAdapter,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 void testClassAdapter() { SocketAdapter sockAdapter = new SocketClassAdapterImpl(); Volt v3 = getVolt(sockAdapter,3); Volt v12 = getVolt(sockAdapter,12); Volt v120 = getVolt(sockAdapter,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 Volt getVolt(SocketAdapter sockAdapter, int i) { switch (i){ case 3: return sockAdapter.get3Volt(); case 12: return sockAdapter.get12Volt(); case 120: return sockAdapter.get120Volt(); default: return sockAdapter.get120Volt(); } } }
Kết quả chạy chương trình như sau
v3 volts using Class Adapter=3 v12 volts using Class Adapter=12 v120 volts using Class Adapter=120 v3 volts using Object Adapter=3 v12 volts using Object Adapter=12 v120 volts using Object Adapter=120
No comments :
Post a Comment