* Ý nghĩa
Mẫu Visitor được dùng để phân tách các thuật toán với cấu trúc của đối tượng tạo điều kiện cho việc thay đổi các phương thức, hàm vào cấu trúc những đối tượng đã có mà không làm thay đổi cấu trúc này.
* Cấu trúc của mẫu
- 41 –
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Các thành phần tham gia vào cấu trúc Visitor:
Visitor: Khai báo một chức năng cho mỗi lớp của ConcreteElement trong cấu trúc của đối tượng.
ConcreteVisitor: Đặt chi tiết mỗi chức năng đã được Visitor khai báo ở trên.
Element: Định nghĩa phương thức Accept lấy Visitor là tham số.
ConcreteElement: Cài đặt cụ thể phương thứcAccept với Visitor là tham số
ObjectStructure: Là chương trình, nó có thể duyệt qua các thành phần
chính của nó và cung cấp các giao tiếp cấp cao sao cho phép các Visitor có thể duyệt các thành tố của chính nó.
* Phạm vi ứng dụng mẫu
Ta thường sử dụng mẫu Visitor khi một cấu trúc đối tượng chứa nhiều lớp đối tượng với nhiều giao tiếp khác nhau và ta muốn thực hiện các chức năng trên
các đối tượng mà phụ thuộc vào các lớp con (lớp Concrete) của chúng.
Nhiều chức năng, thao tác cần được thực hiện trên những đối tượng trong một cấu trúc đối tượng và ta muốn tránh làm phức tạp các lớp của chúng vì những chức năng thêm vào này. Visitor định nghĩa các chức năng, thao tác này riêng vào một lớp khác.
Thông thường, lớp định nghĩa đối tượng cấu trúc hiếm khi bị thay đổi, nhưng ta thường muốn định nghĩa các chức năng, thao tác mới trên cấu trúc này. Việc thay đổi cấu trúc đối tượng này đòi hỏi phải định nghĩa lại tất cả các Visitor. Do đó, nếu cấu trúc đối tượng thường xuyên thay đổi, ta nên định nghĩa các chức năng ngay trong các lớp đó.
- 42 –
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
* Nhận xét
Kỹ thuật Double Dispatch kết hợp với tính đa hình (polymophism) được sử dụng đã thay thế hoàn toàn mệnh đề “If” làm cho mã chương trình dễ dàng mở rộng, hạn chế sự lệ thuộc và thay đổi mã chương trình khi mở rộng.
Tạo khả năng mềm dẻo trong việc thêm mới một hàm, thuật toán xử lý,… trên các đối tượng dữ liệu. Khi cần thêm hàm, thuật toán xử lý ta chỉ cần thêm vào lớp Visitor và cài đặt lại lớp ConcreteVisitor.
Mẫu này giúp ta tách các phương thức, hàm hay thay đổi (được cài trong ConcreteVisitor) và những hành vi, phương thức, hàm không thay đổi (được cài trong đối tượng dữ liệu ConcreteElement).
Hạn chế của mẫu này là việc tạo thêm một đối tượng dữ liệu mới (ConcreteElement) sẽ rất khó khăn, bởi vì lúc đó sẽ làm thêm số phương thức ảo ở lớp Visitor và lúc đó các phương thức của lớp ConcreteVisitor cũng tăng lên. Vì vậy, ta nên áp dụng mẫu này với những đối tượng dữ liệu không thay đổi, mở rộng và chỉ có các hành vi, thuật toán, phương thức tác động lên đối tượng dữ liệu là được cải tiến và thay đổi.