2.1 Bộ chuyển đổi
Bộ điều hợp (Adapter) là một mẫu thiết kế cấu trúc được thiết kế để tổ chức sử dụng các chức năng của một đối tượng không có sẵn để sửa đổi thông qua một giao diện được tạo đặc biệt.
Định nghĩa chính thức hơi phức tạp, nhưng nếu bạn mô tả nó theo cách của riêng mình, bộ điều hợp là một mẫu thiết kế cho phép các đối tượng có giao diện không tương thích hoạt động cùng nhau .
![mô hình bộ điều hợp](https://cdn.codegym.cc/images/article/95aa4e6d-a7eb-4f5b-a228-9bbe87547610/800.jpeg)
Được sử dụng để tổ chức việc sử dụng các chức năng của một đối tượng không có sẵn để sửa đổi thông qua giao diện được tạo đặc biệt. Một lớp bổ sung được tạo có giao diện được yêu cầu và lớp này lần lượt gọi các phương thức của đối tượng mong muốn (không có giao diện được yêu cầu).
Quan trọng! Nếu trong mã bạn gặp hậu tố Bộ điều hợp cho một lớp, thì bạn có quyền cho rằng lớp này hoạt động như một bộ điều hợp và được liên kết với một nhóm các lớp hoạt động theo sơ đồ được mô tả ở trên.
Nó được sử dụng trong trường hợp hệ thống hỗ trợ dữ liệu và hành vi cần thiết, nhưng có giao diện không phù hợp. Cách sử dụng phổ biến nhất của mẫu Adapter là khi bạn muốn tạo một lớp kế thừa từ một lớp trừu tượng mới hoặc lớp hiện có.
Điểm mạnh:
- Việc chuyển đổi sang sử dụng các lớp bên ngoài khác không yêu cầu phải làm lại hệ thống, chỉ cần triển khai thêm một lớp Bộ điều hợp là đủ.
- Độc lập với việc triển khai các lớp bên ngoài (các lớp từ các thư viện có mã mà chúng tôi không thể thay đổi). Chương trình của bạn trở nên độc lập với giao diện của các lớp bên ngoài.
2.2 Người trang trí
Decorator là một mẫu thiết kế cấu trúc để gắn động các hành vi bổ sung vào một đối tượng. Mẫu Decorator cung cấp một giải pháp thay thế tốt và linh hoạt cho việc thực hành phân lớp để mở rộng chức năng.
![hoa văn trang trí](https://cdn.codegym.cc/images/article/c8dcccfe-d3d4-4054-bca0-a984f7371f76/800.jpeg)
Được sử dụng để tự động kết nối các nghĩa vụ bổ sung với một đối tượng.
Nhiều bạn sẽ hỏi: làm thế nào bạn có thể tự động (trong khi chương trình đang chạy) thêm hành vi mới vào một đối tượng? Một đối tượng có thể được lắp ráp từ các mảnh, nghĩa là các đối tượng nhỏ. Ghi chuỗi bộ lọc trong servlet? Hoặc API luồng khi bạn viết truy vấn bằng bộ lọc(), bản đồ(), danh sách()?
IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);
Điểm mạnh của Decorator pattern:
- Không cần tạo các lớp con để mở rộng chức năng của một đối tượng.
- Khả năng tự động kết nối chức năng mới ở bất cứ đâu: trước hoặc sau chức năng chính của đối tượng ConcreteComponent.
2.3 Đại diện
Proxy là một mẫu thiết kế cấu trúc cung cấp một đối tượng kiểm soát quyền truy cập vào một đối tượng khác, chặn và chuyển qua tất cả các cuộc gọi của nó.
![Phó (Người ủy quyền)](https://cdn.codegym.cc/images/article/5f67cf48-0f30-42ca-aa0c-661e9121210d/800.jpeg)
Mẫu Proxy cung cấp một đối tượng thay thế thay cho đối tượng thực. Đối tượng này kiểm soát quyền truy cập vào đối tượng ban đầu. Được sử dụng rất thường xuyên.
Hãy nhớ cách chúng tôi sử dụng khung Mockito và chặn cuộc gọi đến một đối tượng thực bằng phương thức Mockito.spy() hoặc chú thích @Spy? Sau đó, một đối tượng Proxy đặc biệt đã được tạo, thông qua đó tất cả các cuộc gọi đến đối tượng ban đầu đều được thông qua.
Và sau đó chúng ta có thể quản lý các cuộc gọi này bằng cách thêm các quy tắc vào đối tượng. Đúng vậy - đối tượng ban đầu không thay đổi và làm việc với nó trở nên linh hoạt hơn nhiều. Nó đặc biệt hữu ích khi chúng ta không gọi đối tượng proxy từ mã của mình mà chuyển nó đến một nơi nào đó. Do đó kiểm soát giao tiếp của hai đối tượng độc lập với chúng tôi.
Các loại proxy theo mục đích:
- Proxy ghi nhật ký : ghi nhật ký tất cả các cuộc gọi đến “Chủ đề” với các tham số của chúng.
- Proxy từ xa (proxy từ xa): cung cấp liên lạc với “Chủ thể”, ở một không gian địa chỉ khác hoặc trên một máy từ xa. Nó cũng có thể chịu trách nhiệm mã hóa yêu cầu và các đối số của nó và gửi yêu cầu được mã hóa đến “Chủ thể” thực.
- Proxy ảo (virtual proxy): đảm bảo rằng “Chủ thể” thực chỉ được tạo ra khi thực sự cần thiết. Nó cũng có thể lưu trữ một số thông tin về "Chủ thể" thực để trì hoãn việc tạo ra nó.
- Copy-on-write : Cung cấp một bản sao của "đối tượng" khi máy khách thực hiện một số hành động nhất định (trường hợp đặc biệt của "proxy ảo").
- Proxy bảo vệ : Có thể kiểm tra xem người gọi có các quyền cần thiết để thực hiện yêu cầu hay không.
- Caching Proxy : Cung cấp khả năng lưu trữ tạm thời các kết quả tính toán trước khi cung cấp chúng cho nhiều khách hàng có thể chia sẻ kết quả.
- Proxy sàng lọc: Bảo vệ "Chủ thể" khỏi các máy khách nguy hiểm (hoặc ngược lại).
- Proxy đồng bộ hóa : thực hiện kiểm soát truy cập được đồng bộ hóa đối với “Chủ thể” trong môi trường đa luồng không đồng bộ.
- Liên kết “Thông minh” (proxy tham chiếu thông minh): thực hiện các hành động bổ sung khi liên kết đến “Chủ đề” được tạo, ví dụ: tính toán số lượng liên kết đang hoạt động đến “Chủ đề”.
2.4 Cầu
Mẫu Bridge là một mẫu thiết kế cấu trúc được sử dụng để "tách biệt phần trừu tượng và phần triển khai để chúng có thể thay đổi độc lập."
Mẫu cầu nối sử dụng đóng gói, tổng hợp và có thể sử dụng tính kế thừa để chia sẻ trách nhiệm giữa các lớp.
![Cầu](https://cdn.codegym.cc/images/article/ec00bb42-3e78-4eb5-9b0d-b72ed9a63d4f/800.jpeg)
Khi sự trừu tượng hóa và sự thực hiện được tách biệt, chúng có thể thay đổi một cách độc lập. Nói cách khác, khi được triển khai thông qua mẫu cầu nối, việc thay đổi cấu trúc của giao diện không can thiệp vào việc thay đổi cấu trúc của việc triển khai.
Hãy xem xét một sự trừu tượng như một con số. Có nhiều loại hình dạng, mỗi loại có thuộc tính và phương thức riêng. Tuy nhiên, có một cái gì đó hợp nhất tất cả các số liệu. Ví dụ: mỗi hình phải có khả năng tự vẽ, chia tỷ lệ, v.v.
Đồng thời, đồ họa vẽ có thể khác nhau tùy thuộc vào loại hệ điều hành hoặc thư viện đồ họa. Các hình có thể tự vẽ trong các môi trường đồ họa khác nhau. Nhưng việc thực hiện tất cả các phương pháp vẽ trong mỗi hình dạng hoặc sửa đổi hình dạng mỗi khi phương pháp vẽ thay đổi là không thực tế.
Trong trường hợp này, mẫu cầu nối sẽ giúp ích, cho phép bạn tạo các lớp mới sẽ thực hiện vẽ trong các môi trường đồ họa khác nhau. Sử dụng phương pháp này, rất dễ dàng để thêm cả hình dạng mới và cách vẽ chúng.
Kết nối được biểu thị bằng mũi tên trong sơ đồ có thể có 2 ý nghĩa: a) “một loại”, theo nguyên tắc thay thế Liskov và b) một trong những triển khai trừu tượng có thể có. Các ngôn ngữ thường sử dụng tính kế thừa để triển khai cả a) và b), điều này có xu hướng làm phình to hệ thống phân cấp lớp.
Cây cầu phục vụ chính xác để giải quyết vấn đề này: các đối tượng được tạo theo cặp từ một đối tượng của một lớp phân cấp A và phân cấp B, sự kế thừa trong phân cấp A có nghĩa là “đa dạng” theo Liskov và đối với khái niệm “triển khai trừu tượng hóa”, một liên kết từ đối tượng A đến đối tượng B được ghép nối của nó được sử dụng.
2.5 Mặt tiền
Mẫu Mặt tiền là một mẫu thiết kế cấu trúc che giấu sự phức tạp của hệ thống bằng cách giảm tất cả các lệnh gọi bên ngoài có thể có thành một đối tượng duy nhất để ủy quyền chúng cho các đối tượng thích hợp trong hệ thống.
![Mẫu mặt tiền](https://cdn.codegym.cc/images/article/e6717d3d-f5fb-467f-866c-0c610c2d4a4e/800.jpeg)
Làm cách nào để cung cấp một giao diện hợp nhất với một tập hợp các triển khai hoặc giao diện khác nhau, chẳng hạn như cho một hệ thống con, nếu việc liên kết mạnh với hệ thống con đó là không mong muốn hoặc việc triển khai hệ thống con có thể thay đổi?
Xác định một điểm tương tác với hệ thống con - đối tượng mặt tiền cung cấp giao diện chung với hệ thống con và gán cho nó trách nhiệm tương tác với các thành phần của nó. Mặt tiền là một đối tượng bên ngoài cung cấp một điểm vào duy nhất cho các dịch vụ hệ thống con.
Việc triển khai các thành phần hệ thống con khác là riêng tư và không hiển thị đối với các thành phần bên ngoài. Đối tượng mặt tiền cung cấp triển khai mẫu GRASP Chống lại những thay đổi về mặt bảo vệ chống lại những thay đổi trong việc triển khai hệ thống con.
Quan trọng! Mẫu này được sử dụng khi chúng ta muốn ẩn hoàn toàn một số nhóm đối tượng và chuyển tất cả giao tiếp với chúng thông qua đối tượng của chúng ta. Nếu bạn chỉ muốn cung cấp một số quyền kiểm soát đối với quá trình giao tiếp của các đối tượng và không nhất thiết phải ẩn chúng, thì tốt hơn là sử dụng mẫu Proxy.