轉接器模式這裡使用的方式會應用在,假設欲讀取第三方所提供的資料給己用,可是無法因為對方所提供的格式不符合,而去更改對方的code。相對地也不會調整自己讀取格式,因此會定義一轉接器來轉接對方所提供的資料,以此達到符合己用的格式!
轉接器模式需要定義的角色如下:
Target - 在此定義一介面表示需要定義的行為
Adaptee - 再來是表示需要被使用的第三方資源
Adapter - 轉接器本身需要做的動作
在此以成績單產生器來解釋轉接器模式的使用範例
相關程式碼如下:
#Target - 定義成績單產生器需操作的行為
#Adaptee - Third Party成績單產生的方式
#Adapter - 將Third Party輸出的內容轉接成新格式
在此說明Adapter將third party傳過來的list<Transcript>轉換成String[]格式
#Main - 主程式生成Adapter實體
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
轉接器模式需要定義的角色如下:
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
留言
張貼留言