Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 17

Mẫu Visitor

Nhóm số 8
Nội dung
1. Tổng quan
 Tên
 Mô tả ngắn về mẫu
 Phân loại

2. Ngữ cảnh/trường hợp sử dụng


3. Cấu trúc mẫu và mô tả + ví dụ minh họa
4. Các bước hiện thực mẫu + code minh họa cho ví dụ trên
5. Ưu điểm, Nhược điểm
6. Liên quan đến các mẫu khác
1. Tổng quan
• Tên: Visitor

• Phân loại: Behavioral Pattern

• Mô tả: Cho phép định nghĩa các


operation trên một tập hợp các đối tượng
không đồng nhất về kiểu mà không làm
thay đổi định nghĩa về lớp của các đối
tượng đó.
2. Motivation

Visitor được sử dụng khi:

• Sử dụng khi cần thực hiện thao tác trên tất cả các phần tử
của cấu trúc đối tượng phức tạp.
• Sử dụng để làm sạch logic nghiệp vụ của các hành vi phụ
trợ.
• Sử dụng khi một hành vi chỉ có ý nghĩa trong một số lớp của
hệ thống phân cấp lớp, nhưng không có ý nghĩa trong các
lớp khác.
3.1 Cấu trúc mẫu
3.1 cấu trúc mẫu

Visitor interface: khai báo một


tập hợp các phương thức thăm
có thể lấy các phần tử cụ thể
của cấu trúc đối tượng làm đối
số. Các phương thức này có
thể trùng tên nếu chương trình
được viết bằng ngôn ngữ có hỗ
trợ nạp chồng, nhưng kiểu
tham số của chúng phải khác
nhau.
3.1 Cấu trúc mẫu

Concrete Visitor: Mỗi
Concrete Visitor triển khai
một số phiên bản của các
hành vi giống nhau, được
điều chỉnh cho các lớp phần
tử cụ thể khác nhau.
3.1 Cấu trúc mẫu

Element interface:  khai


báo một phương thức để
"chấp nhận" các visitor.
Phương thức này phải có
một tham số được khai báo
với kiểu là visitor interface.
3.1 Cấu trúc mẫu
Mỗi Concrete Element phải triển
khai thực hiện phương thức chấp
nhận. Mục đích của phương thức
này là chuyển hướng cuộc gọi
đến phương thức của visitor thích
hợp tương ứng với lớp phần tử
hiện tại. Cần biết rằng ngay cả khi
một lớp phần tử cơ sở triển khai
phương thức này, tất cả các lớp
con vẫn phải ghi đè phương thức
này trong các lớp của chính
chúng và gọi phương thức thích
hợp trên đối tượng visitor.
3.1 Cấu trúc mẫu

Client thường đại diện cho


một tập hợp hoặc một số
đối tượng phức tạp khác
(ví dụ, một cây
Composite). Thông
thường, các client không
biết tất cả các lớp phần tử
cụ thể vì chúng làm việc
với các đối tượng từ tập
hợp đó thông qua một số
interface trừu tượng.
3.2 Ví dụ minh họa

Giả sử bạn đang phát triển một ứng dụng quản lý nhà hàng
và bạn có một cấu trúc dữ liệu đơn giản để lưu trữ các loại
món ăn. Mỗi loại món ăn có thể là một đối tượng riêng biệt,
nhưng chúng cùng có một phương thức chung là "accept",
cho phép đối tượng visitor thực hiện các hoạt động trên
chúng.
3.2 Vi du minh hoa
Đầu tiên, chúng ta định nghĩa một interface Visitor để đại
diện cho các hoạt động mà chúng ta muốn thực hiện trên
các món ăn:

Tiếp theo, chúng ta định nghĩa một lớp abstract Food để


đại diện cho các loại món ăn:
4. Code minh họa
Sau đó, chúng ta sẽ triển khai các lớp con của Food,
chẳng hạn như Pizza và Hamburger:
Tiếp theo, chúng ta sẽ triển khai các lớp con của Visitor interface để
thực hiện các hoạt động cụ thể trên từng loại món ăn. Trong ví dụ này,
chúng ta sẽ triển khai lớp con để tính toán giá tiền của mỗi loại món ăn
14
Cuối cùng, chúng ta có thể sử dụng các lớp và interface
đã triển khai để thực hiện các hoạt động trên các món ăn

15
5. Ưu điểm, Nhược điểm
Ưu điểm
• Open/Closed Principle: có thể giới thiệu một hành vi mới có thể hoạt
động với các đối tượng của các lớp khác nhau mà không cần thay đổi
các lớp này.
• Single Responsibility Principle: có thể chuyển nhiều phiên bản của cùng
một hành vi vào cùng một lớp.
• Một đối tượng visitor có thể tích lũy một số thông tin hữu ích khi làm
việc với nhiều đối tượng khác nhau. Điều này có thể giúp ích khi ta
muốn duyệt qua một số cấu trúc đối tượng phức tạp, chẳng hạn như
cây đối tượng và áp dụng visitor cho từng đối tượng của cấu trúc này.

Nhược điểm
• Cần cập nhật tất cả visitor mỗi khi một lớp được thêm vào hoặc xóa
khỏi hệ thống phân cấp phần tử.
• Các visitor có thể thiếu quyền truy cập cần thiết vào các trường riêng
tư và phương thức của các phần tử mà họ phải làm việc với.
6. Liên hệ tới các mẫu khác

• Composite:  Có thể sử dụng Visitor để thực hiện một thao tác trên toàn
bộ cây Composite.

• Command:  Có thể xem Visitor là một phiên bản hiệu quả của
Command. Các đối tượng của nó có thể thực thi các operation trên các
đối tượng khác nhau của các lớp khác nhau.

• Iterator:  Có thể sử dụng Visitor cùng với Iterator để duyệt qua một cấu
trúc dữ liệu phức tạp và thực hiện một số thao tác trên các phần tử của
nó, ngay cả khi tất cả chúng đều có các lớp khác nhau.

You might also like