Adapter pattern

Trong công nghệ phần mềm, **Adapter pattern**(mẫu thiết kế tiếp hợp) là **một mẫu thiết kế tiếp hợp** cho phép chuyển đổi một interface có sẵn thành một interface khác thích hợp cho lớp đang viết. Một *adapter* cho phép các lớp làm việc với nhau, mà bình thường là không thể do sự không tương thích về interfaces, bằng cách bao đóng interface của riêng nó cho phù hợp với một lớp có sẵn.

Có hai loại **mẫu điều hợp** (*adapter pattern*):
* Loại *[[Object Adapter pattern]]* - Trong loại mẫu **adapter pattern** này thì *adapter* chứa một thể hiện của lớp mà nó bao đóng. Trong tình huống này thì *adapter* sẽ thực hiện việc gọi hàm đến đối tượng thể hiện được bao đóng đó để thực hiện tác vụ cần thiết.

* Loại *[[Class Adapter pattern]]* - Loại **adapter** này dùng đa kế thừa để đạt được mục đích này. Đối tượng **adapter** này được tạo ra bằng cách kế thừa các interfaces từ cả interface mong đợi và interface đã có sẵn. Đối tượng của mẫu Adapter rất hay được dùng ở các ngôn ngữ phổ biến, như Java, không được hỗ trợ đa kế thừa thực vì các nhà thiết kế các ngôn ngữ này cho rằng chúng là những thói quen không tốt.

Mẫu adapter rất hữu ích trong những tình huống khi tồn tại sẵn một lớp cung cấp một số hay toàn bộ dịch vụ mà bạn cần nhưng không có interface mà bạn cần. Một ví dụ tốt trong cuộc sống thực là một adapter chuyển interface của một Document Object Model từ một tài liệu XML thành một cấu trúc cây mà có thể hiển thị. Một liên kết đến một hướng dẫn sử dụng mẫu thiết kế được liệt kê ở bên dưới.

## Ví dụ - Class Adaptor1


```java
/**
 * Java code sample 
 */
 
 interface Stack
 {
  void push (Object);
  Object pop ();
  Object top ();
 }
 
 /* DoubleLinkedList */
 class DList
 {
  public void insert (DNode pos, Object o) {... }
  public void remove (DNode pos, Object o) {... }
  
  public void insertHead (Object o) {... }
  public void insertTail (Object o) {... }
  
  public Object removeHead () {... }
  public Object removeTail () {... }
  
  public Object getHead () {... }
  public Object getTail () {... }
 }
 
 /* Adapt DList class to Stack interface */
 class DListImpStack extends DList implements Stack
 {
  public void push (Object o) {
 insertTail (o);
  }
  
  public Object pop () {
 return removeTail ();
  }
  
  public Object top () {
 return getTail ();
  }
 }
```


## Ví dụ - Object Adapter


```java
/**
 * Java code sample
 */
 
 interface Stack
 {
  void push (Object o);
  Object pop ();
  Object top ();
 }
 
 /* DoubleLinkedList */
 class DList
 {
  public void insert (DNode pos, Object o) {... }
  public void remove (DNode pos, Object o) {... }
  
  public void insertHead (Object o) {... }
  public void insertTail (Object o) {... }
  
  public Object removeHead () {... }
  public Object removeTail () {... }
  
  public Object getHead () {... }
  public Object getTail () {... }
 }
 
 /* Adapt DList class to Stack interface */
 class DListStack implements Stack 
 { 
  private DList _dlist;
  
  public DListStack() { _dlist = new DList(); }
  public void push (Object o) {
 _dlist.insertTail (o);
  }
  
  public Object pop () {
 return _dlist.removeTail ();
  }
  
  public Object top () {
 return _dlist.getTail ();
  }
 }
```


## Tham khảo

## Liên kết ngoài
* Description in Portland Pattern Repository's Wiki
* Java Tutorial on the Document Object Model (uses the adapter pattern)
* Citations from CiteSeer
* https://en.wikipedia.org/wiki/Adapter_pattern