Hướng dẫn adapter design pattern php - bộ điều hợp thiết kế mô hình php
Show
Đã đăng vào thg 9 20, 2018 2:26 CH 2 phút đọc 2 phút đọc 1.Định nghĩaAdapter Pattern là một mẫu thiết kế cho phép bạn sửa đổi một giao diện (interface) giữa đối tượng (object) và một lớp (class) mà không phải sửa đổi trực tiếp lên chúng. Pattern này được sử dụng khi code của bạn sử dụng một thư viện bên ngoài như (API, Package, Libary ..) hoặc 1 class khác mà có sự thay đổi logic cách thường xuyên. 2.vấn đềGiả sử có 2 người, 1 người đến từ Mỹ và chỉ có thể nói và hiểu tiếng Anh. Và người thứ hai là đến từ Việt Nam (^_^) và anh ta chỉ có thể nói và hiểu tiếng Việt. Bây giờ giả sử 2 người này phải giao tiếp với nhau. Họ sẽ làm như thế nào? Chắc chắn, họ sẽ cần sự giúp đỡ từ một thông dịch viên sẽ dịch từ ngôn ngữ này sang ngôn ngữ khác, để họ có thể giao tiếp với nhau. Trong trường hợp này, thông dịch viên sẽ hoạt động như một Adapter. Giả sử có một người có thị lực yếu. Anh ấy cần đọc báo. Bây giờ mắt anh không tương thích với việc đọc văn bản trên báo. Những gì anh ta cần bây giờ là một cái kính. Ở đây kính sẽ hoạt động như một Adapter. 3.Cấu trúc
4.Ví dụ
Output
5.Lời kếtAdapter Design pattern thực sự rất hữu ích khi bạn code với ứng dụng lớn có sử dụng nhiều API từ bên ngoài, nó giúp bạn giảm thiểu tối đa nhưng thay đổi từ nhà cung cấp API. Nhìn thì thực sự nó hơi phức tạp vì phải tạo ra nhiều lớp và interface khác nhau nhưng nếu hệ thống lớn thì nó lại có rất nhiều hữu ích. All rights reserved Trong bài viết này, chúng ta sẽ cùng tìm hiểu về Adapter Design Pattern qua cấu trúc, cánh triển khai, ví dụ, ưu điểm nhược điểm và ứng dụng của nó. Soạn doc để thuyết trình mấy ngày mà mà chỉ nói có 5ph thôi thì uổng =)) thôi thì tiện thể share cho mọi người luôn. Bài đầu nên không tránh khỏi sai sót, rất mong nhận được góp ý từ mọi người. 1. Tổng quan1.1. Phân loạiAdapter là 1 design pattern thuộc nhóm Structural Pattern. Structural Pattern bao gồm những pattern cung cấp các phương pháp để lắp ráp các đối tượng và lớp thành những cấu trúc phức tạp hơn, đồng thời giữ cấu trúc này linh hoạt và hiệu quả. 1.2. Giới thiệuAdapter Pattern theo định nghĩa của GOF:
Nếu bạn đã từng nghe qua về Decorator Pattern, thì cả Adapter và Decorator đều sử dụng phương thức 'gói' (wrap) object, nhưng Decorator Pattern gói object để gán thêm trách nhiệm cho nó, còn Adapter Pattern gói object để biến hóa interface ban đầu thành interface client cần sử dụng. 1.3. Tóm tắtÝ tưởng chính của Adapter Pattern:
2. Vấn đềTrong cuộc sống, ta thường thấy adapter xuất hiện dưới dạng một thiết bị kết nối giữa các phích cắm và ổ điện khác loại: Adapter trong lập trình hướng đối tượng cũng có chức năng tương tự như thế giới thực: Nó nhận 1 interface và thích ứng để trở thành 1 interface client cần sử dụng. 2.1. Bài toánMột trong những tình huống phải dùng đến adapter pattern là khi bạn tích hợp một thư viện bên ngoài vào chương trình và muốn chỉnh sửa interface của nó cho hợp với chương trình của mình. Tưởng tượng bạn đang thiết kế một phần mềm hỗ trợ vẽ đồ thị và giải toán - một ứng dụng không mấy xa lạ và đã có sẵn nhiều thư viện trên internet. Trong tình huống này bạn lấy trên mạng 1 thư viện thực hiện chức năng vẽ tọa độ 1 điểm trên đồ thị. Nhưng khổ nỗi thư viện đó chỉ hỗ trợ biểu diễn điểm bằng... tọa độ cực. (Giải Tích flashback: tọa độ cực là một cách khác để biểu diễn một điểm, thay vì sử dụng tung độ hoành độ như hệ trục tọa độ Descartes, thì một điểm ở hệ trục tọa độ cực được xác định bằng độ dài tia gốc r và góc quay φ theo chiều ngược chiều kim đồng hồ) Bạn biết rằng client sẽ quen thuộc với cách biểu diễn điểm theo cách hay dùng hơn, nhưng vẫn quá lười để tìm kiếm một thư viện khác và việc sửa code bên trong thư viện là điều không thể. Bài toán đặt ra là: làm sao để đáp ứng nhu cầu của client, tức là nhận tham số đầu vào cho hàm vẽ là tung độ và hoành độ, mà vẫn sử dụng thư viện chỉ hỗ trợ tọa độ cực.làm sao để đáp ứng nhu cầu của client, tức là nhận tham số đầu vào cho hàm vẽ là tung độ và hoành độ, mà vẫn sử dụng thư viện chỉ hỗ trợ tọa độ cực. 2.2. Giải phápĐể làm được chuyện đó, bạn tạo ra một class đặc biệt, gọi là adapter, là thằng trung gian giúp thư viện trên mạng hiểu được yêu cầu của client. Tạm gọi phương thức vẽ điểm là Point(), lớp của thư viện là PolarGraph, interface của client là Graph, và PolarGraphAdapter là lớp adapter đảm nhận việc chuyển đổi. Ta có sơ đồ sau: Nhờ lớp PolarGraphAdapter, client có thể an toàn gọi hàm point nhận tham số đầu vào là trục tung trục hoành. Khi nhận được yêu cầu, PolarGraphAdapter dịch từ x, y sang r và φ, sau đó gọi phương thức Point ở PolarGraph với 2 tham số đầu vào vừa tính được. Kết quả là client cứ tưởng được graph interface xử lý nhưng class thật sự xử lý vẫn là PolarGraph. Và class trung gian điều hướng chính là adapter. 3. Cấu trúc3.1. Sơ đồ lớpĐã đến lúc show sơ đồ lớp chính thức của Adapter Pattern: 3.2. Thành phần
4. Triển khai4.1. Các bước triển khai
4.2. Code mẫuCode mẫu C# cho ví dụ về ứng dụng vẽ đồ thị được nói ở trên:
5. Đánh giá5.1. Ưu điểmAdapter pattern thỏa mãn nhiều quy tắc của lập trình hướng đối tượng và phát triển phần mềm hiệu quả:
5.2. Nhược điểm
5.3. Pattern liên quan
5.4. So sánh5.4.1. Object Adapter và Class AdapterCó 2 loại Adapter, Object adapter và Class adapter. Vừa rồi là Object Adapter. Object Adapter sử dụng composition để truyền yêu cầu đến Adaptee, còn Class Adapter kế thừa lớp Target và lớp Adaptee. Object Adapter: Class Adapter: Lưu ý: Vì Class Adapter yêu cầu đa kế thừa nên không thể triển khai bằng Java.không thể triển khai bằng Java. Vậy khi nào thì sử dụng loại Adapter nào? Vì sử dụng composition, Object Adapter có thể adapt cả lớp cha và các lớp con của nó, đồng thời cũng linh hoạt hơn theo quy tắc composition over inheritance của lập trình hướng đối tượng. Class Adapter không làm được vì là lớp kế thừa, tuy nhiên, nó có điểm mạnh của kế thừa ví dụ như có thể override method của Adaptee nếu nó cần. 6. Ứng dụng trong thực tếAdapter được ứng dụng rộng rãi trong nhiều trường hợp, ta thường thấy Adapter xuất hiện trong những tình huống cần nâng cấp hệ thống cũ và có nhiều class cũ nhưng vẫn chứa method quan trọng, làm cho hệ thống hiệu quả hơn thông qua việc làm các component giao tiếp với nhau dù không liên quan đến nhau. 6.1. Sử dụng Enumerator như một Iterator trong JavaỞ Java, enumerator và iterator đều là những con trỏ để duyệt và truy cập phần tử của 1 collection như Vector, Stack, Hashtable,.... Enumerator xuất hiện ở JDK 1.0 và Iterator được ra mắt ở JDK 1.2. Enumerator cung cấp 2 phương thức hasMoreElement() và nextElement() để kiểm tra sự tồn tại và lấy phần tử tiếp theo trong collection. Tuy nhiên, nó không hỗ trợ các method để thay đổi cấu trúc của collection, và Iterator xuất hiện như là phiên bản cải tiến của enumerator, với các phương thức hasNext(), next() và remove(). Điều này dẫn đến tình huống đôi khi chúng ta vẫn gặp code sử dụng enumerator interface, nhưng ta chỉ muốn sử dụng iterator. Đó là lúc những lập trình viên thiết kế iterator phải sử dụng tới Adapter: chuyển hóa những method của iterator thành những enumerator method tương ứng. Lưu ý rằng, adapter chuyển từ hasNext(), next() sang hasMoreElements() và nextElement() là có thể, nhưng vì enumeration vốn không hỗ trợ remove() nên adapter cũng phải bó tay, không thể triển khai một hàm remove() đủ chức năng ở trong class adapter được. Lúc này, ta có thể chọn phương án throw exception để báo cho client. Peace. Nguồn tham khảo
|