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

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

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

在此以成績單產生器來解釋轉接器模式的使用範例
相關程式碼如下:
#Target - 定義成績單產生器需操作的行為

package adapter.target;

public interface ITranscript {
 /**
  * return string array. String format: Id\tName\tSex\tChinese\tMath\tEnglish
  * @return
  */
 public String[] getTranscript();
}

#Adaptee - Third Party成績單產生的方式

package adapter.adaptee;

import java.util.ArrayList;
import java.util.List;

public class ThirdPartyTranscript {
 public List<Transcript> generateTranscript(){
  List<Transcript> studentList = new ArrayList<Transcript>();
  studentList.add(new Transcript(2,"Ben", "Male", 87, 91, 80));
  studentList.add(new Transcript(1,"Sjkok", "Female", 94, 99, 65));
  studentList.add(new Transcript(3,"Aaron", "Male", 44, 55, 100));
  studentList.add(new Transcript(4,"Zhibin", "Male", 77, 88, 66));
  return studentList;
 }
 
 public class Transcript{
  private int id;
  private String name;
  private String sex;
  private int chinese;
  private int math;
  private int english;
  
  public Transcript(int id, String name, String sex, int chinese, int math, int english) {
   super();
   this.id = id;
   this.sex = sex;
   this.name = name;
   this.chinese = chinese;
   this.math = math;
   this.english = english;
  }
  public int getId() {
   return id;
  }
  public String getName() {
   return name;
  }
  public int getChinese() {
   return chinese;
  }
  public int getMath() {
   return math;
  }
  public int getEnglish() {
   return english;
  }
  public String getSex() { 
   return sex;
  }
 }
}

#Adapter - 將Third Party輸出的內容轉接成新格式

package adapter;

import adapter.adaptee.ThirdPartyTranscript;
import adapter.adaptee.ThirdPartyTranscript.Transcript;
import adapter.target.ITranscript;

public class TranscriptAdapter implements ITranscript{
 private final String delim = "\t";
 
 @Override
 public String[] getTranscript() {
  // TODO Auto-generated method stub
  return new ThirdPartyTranscript().generateTranscript()
           .stream()
           .map(t -> getTranscriptStr(t))
           .toArray(String[]::new);
 }
 
 private String getTranscriptStr(Transcript t) {
  StringBuilder builder = new StringBuilder();
  return builder.append(t.getId()).append(delim)
       .append(t.getName()).append(delim)
       .append(t.getSex()).append(delim)
       .append(t.getChinese()).append(delim)
       .append(t.getMath()).append(delim)
       .append(t.getEnglish()).toString();
 }
}

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

#Main - 主程式生成Adapter實體

package adapter.main;

import adapter.TranscriptAdapter;
//import adapter.sample.TranscriptSample;
import adapter.target.ITranscript;

public class TranscriptGens {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //displayTranscript(new TranscriptSample());
  displayTranscript(new TranscriptAdapter());
 }
 
 public static void displayTranscript(ITranscript t) {
  String[] trans = t.getTranscript();
  for(String tr : trans) {
   System.out.println(tr);
  }
 }
}

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

留言