Java - 轉接器模式(Adapter)範例

轉接器模式這裡使用的方式會應用在,假設欲讀取第三方所提供的資料給己用,可是無法因為對方所提供的格式不符合,而去更改對方的code。相對地也不會調整自己讀取格式,因此會定義一轉接器來轉接對方所提供的資料,以此達到符合己用的格式!

轉接器模式需要定義的角色如下:
Target - 在此定義一介面表示需要定義的行為
Adaptee - 再來是表示需要被使用的第三方資源
Adapter - 轉接器本身需要做的動作

在此以成績單產生器來解釋轉接器模式的使用範例
相關程式碼如下:
#Target - 定義成績單產生器需操作的行為
  1. package adapter.target;
  2. public interface ITranscript {
  3. /**
  4. * return string array. String format: Id\tName\tSex\tChinese\tMath\tEnglish
  5. * @return
  6. */
  7. public String[] getTranscript();
  8. }

#Adaptee - Third Party成績單產生的方式
  1. package adapter.adaptee;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class ThirdPartyTranscript {
  5. public List<Transcript> generateTranscript(){
  6. List<Transcript> studentList = new ArrayList<Transcript>();
  7. studentList.add(new Transcript(2,"Ben", "Male", 87, 91, 80));
  8. studentList.add(new Transcript(1,"Sjkok", "Female", 94, 99, 65));
  9. studentList.add(new Transcript(3,"Aaron", "Male", 44, 55, 100));
  10. studentList.add(new Transcript(4,"Zhibin", "Male", 77, 88, 66));
  11. return studentList;
  12. }
  13. public class Transcript{
  14. private int id;
  15. private String name;
  16. private String sex;
  17. private int chinese;
  18. private int math;
  19. private int english;
  20. public Transcript(int id, String name, String sex, int chinese, int math, int english) {
  21. super();
  22. this.id = id;
  23. this.sex = sex;
  24. this.name = name;
  25. this.chinese = chinese;
  26. this.math = math;
  27. this.english = english;
  28. }
  29. public int getId() {
  30. return id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public int getChinese() {
  36. return chinese;
  37. }
  38. public int getMath() {
  39. return math;
  40. }
  41. public int getEnglish() {
  42. return english;
  43. }
  44. public String getSex() {
  45. return sex;
  46. }
  47. }
  48. }

#Adapter - 將Third Party輸出的內容轉接成新格式
  1. package adapter;
  2. import adapter.adaptee.ThirdPartyTranscript;
  3. import adapter.adaptee.ThirdPartyTranscript.Transcript;
  4. import adapter.target.ITranscript;
  5. public class TranscriptAdapter implements ITranscript{
  6. private final String delim = "\t";
  7. @Override
  8. public String[] getTranscript() {
  9. // TODO Auto-generated method stub
  10. return new ThirdPartyTranscript().generateTranscript()
  11. .stream()
  12. .map(t -> getTranscriptStr(t))
  13. .toArray(String[]::new);
  14. }
  15. private String getTranscriptStr(Transcript t) {
  16. StringBuilder builder = new StringBuilder();
  17. return builder.append(t.getId()).append(delim)
  18. .append(t.getName()).append(delim)
  19. .append(t.getSex()).append(delim)
  20. .append(t.getChinese()).append(delim)
  21. .append(t.getMath()).append(delim)
  22. .append(t.getEnglish()).toString();
  23. }
  24. }

在此說明Adapter將third party傳過來的list<Transcript>轉換成String[]格式

#Main - 主程式生成Adapter實體
  1. package adapter.main;
  2. import adapter.TranscriptAdapter;
  3. //import adapter.sample.TranscriptSample;
  4. import adapter.target.ITranscript;
  5. public class TranscriptGens {
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. //displayTranscript(new TranscriptSample());
  9. displayTranscript(new TranscriptAdapter());
  10. }
  11. public static void displayTranscript(ITranscript t) {
  12. String[] trans = t.getTranscript();
  13. for(String tr : trans) {
  14. System.out.println(tr);
  15. }
  16. }
  17. }

DEMO如下:
2 Ben Male 87 91 80
1 Sjkok Female 94 99 65
3 Aaron Male 44 55 100
4 Zhibin Male 77 88 66

留言