Suy nghĩ trong anh về mẫu thiết kế “Adapter Pattern” (Phần Cuối)

Xin chào mọi người, hôm nay mình quay lại và sẽ đưa một demo nhỏ sử dụng Adapter Pattern mình thấy khá hay. Demo viết bằng javascript, mọi người có thể copy và qua https://jsfiddle.net/ để chạy thử. Hoặc chạy file js trong VSCode nhé, để chạy file JS thì các bạn cài extension Code Runner sau đó thì chuột phải vào vùng editor code và chọn Run Code để chạy và xuất log ra Output nhé như hình bên dưới của mình.

Capture2

Untitled2

Trong ví dụ:

  • Client — Trong code mẫu là hàm run() .
    • gọi tới Adapter để gửi request
  • Adapter — Trong code mẫu là hàm ShippingAdapter
    • thực thi giao diện mà client mong muốn
  • Adaptee — Trong code mẫu là hàm AdvancedShipping
    • Đối tượng được chuyển đổi
    • có giao diện khác với giao diện client mong muốn
// old interface
function Shipping() {
this.request=function (zipStart, zipEnd, weight) {
// …
return “100.000 VND”;
}
}
// new interface
function AdvancedShipping() {
this.login=function (credentials) { /* … */ };
this.setStart=function (start) { /* … */ };
this.setDestination=function (destination) { /* … */ };
this.calculate=function (weight) {
return “50.000 VND”;
};
}
// adapter interface
function ShippingAdapter(credentials) {
varshipping=newAdvancedShipping();
shipping.login(credentials);
return {
request:function (zipStart, zipEnd, weight) {
shipping.setStart(zipStart);
shipping.setDestination(zipEnd);
returnshipping.calculate(weight);
}
};
}
function run() {
varshipping=newShipping();
varcredentials= {
token:”30a8-6ee1″
};
varadapter=newShippingAdapter(credentials);
// original shipping object and interface
varcost=shipping.request(“78701”, “10010”, “2 kg”);
console.log(“Giá cũ: “+cost);
// new shipping object with adapted interface
cost=adapter.request(“78701”, “10010”, “2 kg”);
console.log(“Giá mới: “+cost);
}
// run code
run();
Khi này toán giao hàng đặt ra có thêm yếu tố giấy phép bắt buộc ta phải viết một Adapter để chuyển đổi giao diện. Cũng là request đó nhưng trong phần thân Adapter đã có những chuyển đổi để gọi tới giao diện mới. Trên đây là ví dụ của mình, cảm ơn mọi người đã đọc. Hẹn gặp mọi người trong những bài đăng khác nha…!
Advertisements

Suy nghĩ trong anh về mẫu thiết kế “Adapter Pattern” (Phần 2)

Xin chào các bạn lại là mình đây 😀 Hôm nay mình sẽ tiếp tục với bài viết về Adapter Pattern. Nhắc lại một chút về bài trước chúng ta đã cùng nhau tìm hiểu định nghĩa, thành phần cũng như cách thức hoạt động, phân loại và ưu nhược điểm của mẫu Adapter Pattern. À chúng ta còn nói sơ về vấn đề đặt ra của mẫu và các mẫu liên quan như dưới:

  • Các vấn đề đặt ra của mẫu Adapter Pattern:
    • Adapter có thể điều chỉnh bao nhiêu chuyển đổi?
    • Pluggable adapters
    • Sử dụng Adapter hai chiều cho việc sử dụng xuyên suốt chương trình
  • Các mẫu thiết kế có liên quan với Adapter Pattern:
    • Bridge
    • Decorator
    • Proxy

Vậy hôm nay mình sẽ đi sâu chi tiết về các vấn đề đặt ra của mẫu Adapter Pattern và các thiết kế mẫu liên quan với Adapter nhé. Nào chúng ta cùng lên đường…

Các vấn đề đặt ra ở đây có nghĩa là các vấn đề cần phải xem xét khi làm việc với mẫu thiết kế Adapter. Có 3 vấn đề được ưu tiên xem xét đó là:

  1. How much adapting does Adapter do?
    – Adapter có thể điều chỉnh bao nhiêu thay đổi? Adapter có thể xử lý chuyển đổi nhiều công việc với Adaptee và với giao diện Target. Nó có thể hỗ trợ những công việc nhẹ nhàng như đổi tên operation cho tới thiết lập lại từ đầu một operation. Số lượng giao diện chuyển đổi này phụ thuộc vào “nền” tức là các giao diện trước có sẵn có cần thay đổi nhiều hay là không.
  2. Pluggable adapters
    – Một lớp có thể tái sử dụng nhiều hơn khi chúng ta giảm thiểu tối đa đến việc sử dụng các lớp khác phải tạo ra để sử dụng nó. Bằng cách xây dựng chuyển đổi các giao diện vào một lớp, chúng ta có thể loại bỏ việc sử dụng các lớp khác với cùng một giao diện. Nói cách khác, giao diện chuyển đổi cho phép chúng ta kết hợp lớp của chúng ta vào các hệ thống hiện có trong khi vẫn có thể chờ đợi các giao diện khác cho lớp.
    – Ví dụ cho vấn đề này: Hãy xem xét một widget TreeDisplay có thể hiển thị cấu trúc cây đồ họa. Nếu đây là một widget chuyên dụng để sử dụng chỉ trong một ứng dụng, thì chúng ta có thể yêu cầu các đối tượng mà nó hiển thị để có một giao diện cụ thể; có nghĩa là, tất cả phải chuyển xuống từ một lớp abstract Tree. Nhưng nếu chúng ta muốn làm cho TreeDisplay tái sử dụng nhiều hơn (nói rằng chúng ta muốn biến nó trở thành một phần của bộ công cụ của các widget tích hợp), thì yêu cầu đó sẽ là không hợp lý. Các ứng dụng sẽ định nghĩa các lớp riêng của chúng cho các cấu trúc cây. Chúng không nên bị buộc phải sử dụng lớp abstract Tree. Cấu trúc cây khác nhau sẽ có giao diện khác nhau.
    – Trong một hệ thống phân cấp thư mục, ví dụ, trẻ em có thể được truy cập với một hoạt động GetSubdirectories, trong khi trong một hệ thống phân cấp thừa kế, hoạt động tương ứng có thể được gọi là GetSubclasses. Một widget TreeDisplay có thể tái sử dụng phải có khả năng hiển thị cả hai loại phân cấp ngay cả khi chúng sử dụng các giao diện khác nhau. Nói cách khác, TreeDisplay nên có khả năng thích ứng giao diện được tích hợp vào nó.
  3. Using two-way adapters to provide transparency
    – Sử dụng Adapter hai chiều cho việc sử dụng xuyên suốt chương trình: một vấn đề nữa với Adapter đó là chúng không rõ ràng đối với phía client. Một đối tượng được chuyển đổi thì không hoàn toàn phù hợp với giao diện Adaptee, vì vậy nó không thể sử dụng giống như là bất cứ khi nào một đối tượng Adaptee có thể sử dụng. Two-way adapters có thể cung cấp sự thông suốt này. Rõ ràng là việc sử dụng này có ích khi mà 2 clients khác nhau cần sử dụng chung một hế thống từ 2 phía. Và việc dùng Two-way adapters là rất cần thiết và có vai trò quan trọng trong mô hình 2 clients.

Continue reading

Suy nghĩ trong anh về mẫu thiết kế “Adapter Pattern” (Phần 1)

Khi nhắc đến Adapter bạn nghĩ tới điều gì? Đó là cục nằm giữa 2 cái đầu cắm hay nó là miếng gắn thẻ nhớ vào cắm vào máy tính beated

Capture

Đúng là như vậy nhưng khi đi vào lĩnh vực lập trình và cụ thể ở đây là Design Pattern thì Adapter có nghĩ là bộ chuyển đổi trung gian.

  • Định nghĩ về Adapter Pattern:
    Adapter Pattern là pattern giữ vai trò trung gian giữa hai lớp, chuyển đổi giao diện của một hay nhiều lớp có sẵn thành một giao diện khác, thích hợp cho lớp đang viết. Điều này giúp các lớp có interface không tương thích có thể làm việc với nhau.
    – Adapter còn có tên gọi khác là Wrapper
    – Adapter thuộc nhóm cấu trúc mẫu Structural Pattern
  • Vậy mục đích sử dụng của Adapter Pattern là gì?
    – Chuyển đổi interface có sẵn thành một interface khác thích hợp cho class hiện tại
    – Tái sử dụng lại interface có sẵn để giảm thiểu việc viết lại code vẫn đảm bảo yêu cầu
    – Xây dựng, mở rộng các phương thức của lớp có sẵn để phù hợp với yêu cầu
  • Các thành phần tham gia vào mẫu thiết kế Adapter:
    Capture– Client: Đây là lớp sẽ sử dụng đối tượng của bạn (đối tượng mà bạn muốn chuyển đổi giao diện).
    – Adaptee: Đây là những lớp bạn muốn lớp Client sử dụng, nhưng hiện thời giao diện của nó không phù hợp.
    – Adapter: Đây là lớp trung gian, thực hiện việc chuyển đổi giao diện cho Adaptee và kết nối Adaptee với Client.
    – Target: định nghĩa giao diện đang làm việc (domain specific).

Continue reading