Tôi đưa vào chủ đề.
Tất cả bốn mẫu có rất nhiều điểm chung, cả bốn mẫu đôi khi được gọi một cách không chính thức hoặc các mẫu bao bọc. Tất cả sử dụng thành phần, gói chủ đề và ủy thác thực hiện cho chủ thể tại một số điểm, thực hiện ánh xạ một phương thức gọi đến một phương thức khác. Họ dành cho khách hàng sự cần thiết phải xây dựng một đối tượng khác và sao chép tất cả dữ liệu liên quan. Nếu được sử dụng một cách khôn ngoan, chúng sẽ tiết kiệm bộ nhớ và bộ xử lý.
Bằng cách thúc đẩy khớp nối lỏng lẻo, họ làm cho mã ổn định một lần ít bị phơi bày trước những thay đổi không thể tránh khỏi và dễ đọc hơn cho các nhà phát triển đồng nghiệp.
Bộ chuyển đổi
Bộ điều hợp điều chỉnh chủ đề (bộ điều hợp) sang một giao diện khác. Bằng cách này, chúng ta có thể thêm đối tượng được đặt vào một bộ sưu tập các loại khác nhau.
Bộ điều hợp chỉ hiển thị các phương thức có liên quan đến máy khách, có thể hạn chế tất cả các phương thức khác, tiết lộ ý định sử dụng cho các bối cảnh cụ thể, như điều chỉnh thư viện bên ngoài, làm cho nó xuất hiện ít chung hơn và tập trung hơn vào nhu cầu ứng dụng của chúng tôi. Bộ điều hợp tăng khả năng đọc và tự mô tả mã của chúng tôi.
Bộ điều hợp bảo vệ một đội khỏi mã dễ bay hơi từ các đội khác; một công cụ cứu sinh khi làm việc với các đội ngoài khơi ;-)
Mục đích ít được đề cập đến nó để ngăn lớp chủ đề vượt quá các chú thích. Với rất nhiều khung dựa trên các chú thích, điều này trở nên quan trọng hơn bao giờ hết.
Bộ điều hợp giúp vượt qua giới hạn Java chỉ có tính kế thừa duy nhất. Nó có thể kết hợp một số người thích nghi dưới một phong bì tạo ấn tượng về sự kế thừa nhiều.
Mã khôn ngoan, Adaptor là loại mỏng. Nó không nên thêm nhiều mã vào lớp người thích ứng, ngoài việc gọi phương thức thích nghi và chuyển đổi dữ liệu không thường xuyên cần thiết để thực hiện các cuộc gọi như vậy.
Không có nhiều ví dụ về bộ điều hợp tốt trong JDK hoặc các thư viện cơ bản. Các nhà phát triển ứng dụng tạo Bộ điều hợp, để điều chỉnh các thư viện cho các giao diện cụ thể của ứng dụng.
Người trang trí
Trình trang trí không chỉ ủy thác, không chỉ ánh xạ một phương thức này sang phương thức khác, họ còn làm nhiều hơn, họ sửa đổi hành vi của một số phương thức chủ đề, nó có thể quyết định không gọi phương thức chủ đề nào cả, ủy thác cho một đối tượng khác, một đối tượng trợ giúp.
Trình trang trí thường thêm chức năng (trong suốt) vào đối tượng được bọc như ghi nhật ký, mã hóa, định dạng hoặc nén vào chủ đề. Chức năng mới này có thể mang lại rất nhiều mã mới. Do đó, các nhà trang trí thường rất nhiều người thích Fatter, sau đó là Người thích nghi.
Trình trang trí phải là một lớp con của giao diện của chủ đề. Chúng có thể được sử dụng trong suốt thay vì các đối tượng của nó. Xem BufferedOutputStream, nó vẫn là OutputStream và có thể được sử dụng như vậy. Đó là một sự khác biệt kỹ thuật lớn từ Bộ điều hợp.
Các ví dụ về sách giáo khoa của toàn bộ gia đình trang trí có sẵn trong JDK - Java IO. Tất cả các lớp như BufferedOutputStream , FilterOutputStream và ObjectOutputStream đều là những người trang trí cho OutputStream . Chúng có thể được xếp lớp hành tây, trong đó một trang trí được trang trí lại, thêm chức năng.
Ủy quyền
Proxy không phải là một trình bao bọc thông thường. Đối tượng được bao bọc, chủ đề proxy, có thể chưa tồn tại tại thời điểm tạo proxy. Proxy thường tạo ra nó trong nội bộ. Nó có thể là một đối tượng nặng được tạo theo yêu cầu hoặc nó là đối tượng từ xa trong JVM khác nhau hoặc nút mạng khác nhau và thậm chí là một đối tượng không phải Java, một thành phần trong mã gốc. Nó hoàn toàn không phải bọc hoặc ủy thác cho một đối tượng khác.
Ví dụ điển hình nhất là proxy từ xa, khởi tạo đối tượng nặng và proxy truy cập.
Remote Proxy - chủ đề nằm trên máy chủ từ xa, JVM khác hoặc thậm chí không phải hệ thống Java. Proxy chuyển các cuộc gọi phương thức sang các cuộc gọi RMI / REST / SOAP hoặc bất cứ điều gì cần thiết, bảo vệ khách hàng tiếp xúc với công nghệ cơ bản.
Lazy Load Proxy - khởi tạo hoàn toàn đối tượng chỉ sử dụng đầu tiên hoặc sử dụng chuyên sâu đầu tiên.
Proxy truy cập - kiểm soát quyền truy cập vào chủ đề.
Mặt tiền
Mặt tiền được liên kết chặt chẽ với nguyên tắc thiết kế của kiến thức tối thiểu (Law of Demeter). Mặt tiền rất giống với Adaptor. Cả hai bao bọc, cả hai ánh xạ đối tượng này sang đối tượng khác, nhưng chúng khác nhau về ý định. Mặt tiền làm phẳng cấu trúc phức tạp của một đối tượng, đồ thị đối tượng phức tạp, đơn giản hóa việc truy cập vào một cấu trúc phức tạp.
Mặt tiền bao bọc một cấu trúc phức tạp, cung cấp một giao diện phẳng cho nó. Điều này ngăn đối tượng khách hàng tiếp xúc với các mối quan hệ bên trong trong cấu trúc chủ thể do đó thúc đẩy khớp nối lỏng lẻo.
Cầu
Biến thể phức tạp hơn của mẫu Adaptor trong đó không chỉ thực hiện khác nhau mà còn trừu tượng hóa. Nó thêm một sự gián tiếp cho phái đoàn. Đoàn thêm là cầu. Nó tách bộ điều hợp ngay cả từ giao diện thích ứng. Nó làm tăng độ phức tạp hơn bất kỳ mẫu quấn nào khác, vì vậy hãy cẩn thận.
Sự khác biệt trong các nhà xây dựng
Sự khác biệt mẫu cũng rõ ràng khi nhìn vào các nhà xây dựng của họ.
Proxy không bao bọc một đối tượng hiện có. Không có chủ đề trong constructor.
Trình trang trí và Bộ điều hợp không bao bọc đối tượng đã có và thường
được cung cấp trong hàm tạo.
Hàm tạo mặt tiền lấy phần tử gốc của toàn bộ biểu đồ đối tượng, nếu không, nó trông giống như Bộ điều hợp.
Ví dụ thực tế - Bộ điều hợp Marshall JAXB . Mục đích của bộ chuyển đổi này là ánh xạ một lớp phẳng đơn giản đến cấu trúc phức tạp hơn được yêu cầu bên ngoài và để ngăn chặn lớp chủ đề "gây ô nhiễm" với các chú thích quá mức.