"สวัสดี Amigo! วันนี้ฉันจะบอกคุณว่า « อะแดปเตอร์ » คือ อะไรฉันหวังว่าหลังจากเรียนรู้เกี่ยวกับหัวข้อนี้แล้ว คุณจะมีความเข้าใจที่ดีขึ้นเกี่ยวกับสตรีมอินพุต/เอาต์พุต"

อะแดปเตอร์ - 1

จินตนาการว่าโปรแกรมของคุณใช้สองเฟรมเวิร์กที่เขียนโดยโปรแกรมเมอร์/บริษัทอื่น เฟรมเวิร์กทั้งสองนั้นดีมากและใช้หลักการ OOP: สิ่งที่เป็นนามธรรม, ความหลากหลาย, การห่อหุ้ม เมื่อรวมกันแล้ว จะครอบคลุมสิ่งที่โปรแกรมของคุณต้องทำเกือบทั้งหมด คุณเหลืองานง่ายๆ คุณต้องส่งวัตถุที่สร้างโดยเฟรมเวิร์กหนึ่งไปยังเฟรมเวิร์กอื่น แต่เฟรมเวิร์กทั้งสองต่างกันอย่างสิ้นเชิงและ "ไม่รู้จักกัน" นั่นคือไม่มีคลาสใดเหมือนกัน คุณต้องแปลงวัตถุของเฟรมเวิร์กหนึ่งให้เป็นวัตถุของอีกเฟรมหนึ่ง

งานนี้สามารถแก้ไขได้อย่างสวยงามโดยใช้เทคนิค « อะแดปเตอร์ » (รูปแบบการออกแบบ):

รหัสจาวา คำอธิบาย
class MyClass implements Interface2
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
// This is where we put the Interface2 methods
// that call Interface1 methods
}
สิ่งนี้สะท้อนถึงรูปแบบการออกแบบอแด็ปเตอร์

แนวคิดพื้นฐานคือคลาส MyClass จะแปลง (ปรับ) อินเทอร์เฟซหนึ่งไปยังอีกอินเทอร์เฟซหนึ่ง

"คุณช่วยยกตัวอย่างที่เจาะจงกว่านี้หน่อยได้ไหม"

"ตกลง สมมติว่าแต่ละเฟรมเวิร์กมีอินเทอร์เฟซ "รายการ" เฉพาะของตัวเอง พวกมันอาจมีลักษณะดังนี้:"

รหัสจาวา คำอธิบาย
interface AlphaList
{
 void add(int value);
 void insert(int index, int value);
 int get(int index);
 void set(int index, int value);
 int count();
 void remove(int index);
}
รหัสจากกรอบแรก ( อัลฟ่า )

AlphaListเป็นหนึ่งในอินเทอร์เฟซที่อนุญาตให้รหัสเฟรมเวิร์กโต้ตอบกับโค้ดที่ใช้เฟรมเวิร์ก

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager เป็นคลาสในเฟรมเวิร์ก เมธอด createList จะสร้างวัตถุ AlphaList
interface BetaList
{
 int getValue(int index);
 void setValue(int index, int value);
 int getSize();
 void setSize(int newSize);
}
class BetaSaveManager
{
 public static void saveList(BetaList list)
 {
  //some code to save a BetaList object
  //to a file on disk
 }
}
รหัสจากเฟรมเวิร์กที่สอง ( เบต้า )

BetaListเป็นหนึ่งในอินเทอร์เฟซที่อนุญาตให้รหัสเฟรมเวิร์กโต้ตอบกับโค้ดที่ใช้เฟรมเวิร์ก

BetaSaveManagerเป็นคลาสในเฟรมเวิร์ก วิธี การ saveListจะบันทึกวัตถุ BetaList

class ListAdapter implements BetaList
{
 private AlphaList list;
 ListAdapter(AlphaList list)
 {
  this.list = list;
 }

 int getValue(int index)
 {
  return this.list.get(index);
 }

 void setValue(int index, int value)
 {
  this.list.set(index, value);
 }

 int getSize()
 {
  return this.list.count();
 }

 void setSize(int newSize)
 {
  if (newSize > this.list.count()
  {
   while (this.list.count() < newSize)
  {
   this.list.add(null);
  }
 }
 else if (newSize < this.list.count() {
   while (this.list.count() > newSize)
   {
    list.remove(list.count() - 1);
   }
  }
 }
}
คลาส «Adapter» ที่แปลงจาก อินเตอร์เฟส AlphaListเป็นอินเตอร์เฟสBetaList

คลาส ListAdapter ใช้ อินเทอร์เฟ ซ BetaList จากเฟรมเวิร์กที่สอง

เมื่อมีคนเรียกใช้เมธอดเหล่านี้ รหัสคลาส «ส่งต่อ» การเรียกไปยัง ตัวแปร รายการซึ่งเป็นAlphaListจากเฟรมเวิร์กแรก

วัตถุAlphaListถูกส่งผ่านไปยังตัวสร้างListAdapter

เมธอดsetSizeทำงานตามกฎต่อไปนี้: หากต้องเพิ่มขนาดของรายการ ให้เพิ่มรายการว่าง (null) หากต้องการลดขนาดของรายการ ให้ลบรายการในตอนท้าย

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
ตัวอย่างของวิธีการใช้

"ฉันชอบตัวอย่างสุดท้ายของคุณมากที่สุด กระชับและเข้าใจได้ดีมาก"