"Xin chào, Amigo! Hôm nay tôi sẽ cho bạn biết chính xác « bộ chuyển đổi » là gì. Tôi hy vọng rằng sau khi tìm hiểu về chủ đề này, bạn sẽ hiểu rõ hơn về các luồng đầu vào/đầu ra."

Bộ điều hợp - 1

Hãy tưởng tượng chương trình của bạn sử dụng hai khung được viết bởi các lập trình viên/công ty khác. Cả hai khung đều rất tốt và sử dụng các nguyên tắc OOP: trừu tượng, đa hình, đóng gói. Cùng với nhau, chúng gần như bao trùm hoàn toàn những gì chương trình của bạn cần làm. Bạn còn lại với một nhiệm vụ đơn giản. Bạn cần chuyển các đối tượng được tạo bởi một khung này sang khung khác. Nhưng cả hai framework hoàn toàn khác nhau và "không biết gì về nhau", tức là chúng không có bất kỳ lớp chung nào. Bạn cần bằng cách nào đó chuyển đổi các đối tượng của khung này thành đối tượng của khung kia.

Nhiệm vụ này có thể được giải quyết một cách đẹp mắt bằng cách áp dụng kỹ thuật « bộ chuyển đổi » (mẫu thiết kế):

mã Java Sự miêu tả
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
}
Điều này phản ánh mẫu thiết kế bộ điều hợp.

Ý tưởng cơ bản là lớp MyClass chuyển đổi (thích ứng) giao diện này sang giao diện khác.

"Bạn có thể cho tôi một ví dụ cụ thể hơn?"

"OK. Giả sử rằng mỗi khung có giao diện" danh sách "độc nhất của riêng nó. Chúng có thể trông giống như thế này:"

mã Java Sự miêu tả
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);
}
Mã từ khung ( Alpha ) đầu tiên

AlphaList là một trong những giao diện cho phép mã khung tương tác với mã sử dụng khung.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager là một lớp trong khuôn khổ. Phương thức createList của nó tạo ra mộtđối tượng 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
 }
}
Mã từ khung ( Beta ) thứ hai.

BetaList là một trong những giao diện cho phép mã khung tương tác với mã sử dụng khung.

BetaSaveManager là một lớp trong khuôn khổ. Phương thức saveList của nólưu mộtđối tượng 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);
   }
  }
 }
}
Lớp «Adapter» chuyển đổi từ giao diện AlphaList sang giao diện BetaList

Lớp ListAdapter triển khai giao diện BetaList từ khung thứ hai.

Khi ai đó gọi các phương thức này, mã lớp «chuyển tiếp» các lệnh gọi đến biến danh sách , là một AlphaList từ khung đầu tiên.

Một đối tượng AlphaList được chuyển đến hàm tạo ListAdapter

Phương thức setSize hoạt động theo các quy tắc sau: nếu kích thước của danh sách phải tăng lên, hãy thêm các mục trống (null). Nếu kích thước của danh sách cần giảm, hãy xóa các mục ở cuối.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Một ví dụ về cách nó có thể được sử dụng

"Tôi thích ví dụ cuối cùng của bạn nhất. Rất ngắn gọn và dễ hiểu."