Tải bản đầy đủ (.docx) (12 trang)

thiết kế phần mềm hướng đối tượng visitor pattern

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (293.4 KB, 12 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO MÔN HỌC
THIẾT KẾ PHẦN MỀM HƯỚNG ĐỐI TƯỢNG
VISITOR PATTERN
GVHD: Ths. Nguyễn Trần Thi Văn


Mục lục


1. Giới thiệu đề tài
1.1.

Đặt vấn đề

Phương tiện
ShowThongTin()
ThanhToan(km)

Xe máy

Oto 4 chỗ

Oto 7 chỗ

ShowThongTin()
ThanhToan(km)


ShowThongTin()
ThanhToan(km)

ShowThongTin()
ThanhToan(km)

Giả sử chúng ta có một cấu trúc bao gồm các đối tượng xe máy, oto 4 chỗ, oto 7 chỗ có cùng
một interface là Phương tiện. Các đối tượng này sẽ override lại các phương thức của interface bao
gồm showThongTin(), ThanhThoan(Km).
Vấn đề ở đây là khi chúng ta muốn thêm một phương thức mới cho vào interface Phương
tiện thì tất cả các đối tượng sẽ phải thêm vào phương thức mới này dù có thực hiện hay không

Phương tiện
ShowThongTin()
ThanhToan(km)
ThanhToanThe()

Xe máy

Oto 4 chỗ

Oto 7 chỗ

ShowThongTin()
ThanhToan(km)
ThanhToanThe()

ShowThongTin()
ThanhToan(km)
ThanhToanThe()


ShowThongTin()
ThanhToan(km)
ThanhToanThe()


Việc này sẽ làm rất tốn thời gian đặc biệt là trong các phần mềm lớn có rất nhiều lớp đối
tượng và có khả năng sẽ thêm rất nhiều phương thức khi cần thiết. Chính vì vậy mà Visitor pattern
ra đời để phần nào giải quyết được vấn đề này


1.2.

Tổng quan

Định nghĩa
Visitor là mẩu thiết kế thuộc nhóm Behavioral cho phép định nghĩa các thao tác(operations)
trên một tập hợp các đối tượng (objects) không đồng nhất (về kiểu) mà không làm thay đổi định
nghĩa về lớp(classes) của các đối tượng đó. Để đạt được điều này, trong mẩu thiết kế visitor ta định
nghĩa các thao tác trên các lớp tách biệt gọi các lớp visitors, các lớp này cho phép tách rời các thao
tác với các đối tượng mà nó tác động đến. Với mỗi thao tác được thêm vào, một lớp visitor tương
ứng được tạo ra.
Khi nào nên sử dụng visitor pattern
Khi có nhiều lớp đối tượng với cấu hình khác nhau và ta muốn thực hiện những phương
thức giống nhau về hình thức nhưng khác nhau về cách thức và phụ thuộc và những đối tượng ấy
Khi chúng ta muốn thêm, hoặc thay đổi các lớp phương thức thì việc sử dụng visitor sẽ giúp
ta không phải định nghĩa lại trên các lớp đối tượng.


2. Chi tiết về Visitor pattern

2.1.

Sơ đồ và ý nghĩa


Visitor: Là 1 interface định nghĩa các phương thức. Với mỗi kiểu của các đối tượng
(ConcreteElement) ta có một phương thức visit với tham số truyền vào là một thực thể của
kiểu đó. Mỗi phương thức như thế có nhiệm vụ xử lý trên các thực thể của lớp tương ứng.
ConcreteVisitor: Overide lại các phương thức của cha. Mỗi phương thức như thế có
nhiệm vụ xử lý trên các thực thể của lớp tương ứng.
ConcreteElement: Overide lại phương thức Accept của cha. Thực hiện các phương
thức trong lớp Visitor. Trong cài đặt của phương thức này ta gọi hàm visit của visitor với
tham số chính là đối tượng gọi
Element: Là 1 interface định nghĩa phương thức Accept có tham số là visitor


2.2.

Ưu và nhược điểm

Ưu điểm
Visitor khiến việc thêm các phương thức dễ dàng hơn. Khi muốn thêm một phương
mới chúng ta chỉ cần tạo lớp phương thức implement interface visitor và override lại các
phương thức cha


visitor
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )


XemThongTin

ThanhToan

Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )

Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )

ThanhToanThe
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )

Visitor thu thập các phương thức liên quan lại với nhau, đơn giản hóa việc sử dụng
các phương thức phụ thuộc vào đối tượng cần sử dụng
Các thuật toán, cách sử dụng cấu trúc dữ liệu sẽ được ẩn thông qua việc sử dụng
visitor
Nhược điểm
Khi có một đối tượng mới như là lớp MayBay và chúng ta muốn thêm vào và kế thừa
lớp PhuongTien. Để có thể thực hiện các phương thức, thao tác cần thiết trên đối tượng
MayBay chúng ta cần phải thêm phương thức Visit(MayBay) vào interface Visitor điều này
đồng nghĩa với việc các lớp con cũng phải thêm phương thức này. Trong một số trường hợp
đối tượng MayBay không cần sử dụng 1 số phương thức chúng ta cũng phải thêm. Việc này
tốn khá nhiều thời gian và công sức nếu chương trình có cấu trúc lớn
visitor

Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )
Visit ( MayBay)

XemThongTin
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )
Visit ( MayBay)

ThanhToan
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )
Visit ( MayBay)

ThanhToanThe
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )
Visit ( MayBay)


2.3.

Các mẫu liên quan
Visitor có liên quan tới 2 mẫu thiết kế đó là Composite và Interpreter trong phần này

Chúng ta sẽ xét mẫu Composite

Visitor có thể được áp dụng để thay thế các phương thức trong cấu trúc đối tượng
được định nghĩa bởi Composite Pattern

Đây là cấu trúc Composite pattern cơ bản


Các phương thức operation() đã được chuyển thành phương thức Accept(Visior
v).Các phương thức đã độc lập với các đối tượng khi cần thiết chúng ta có thể chỉnh sửa
hoặc thêm vào mà không ảnh hương đến cấu trúc đối tượng composite.
2.4.

Biến thể
Như đã trình bày thì nhược điểm của visitor pattern là việc thêm 1 đối tượng mới sẽ
rất khó khăn khi ta thêm một lớp đối tượng mới. Vì thế ta có biến thể của Visitor pattern là
Acyclic visitor


Với lớp interface ban đầu sẽ là 1 lớp interface không có phương thức. Với mỗi lớp đối
tượng ta tạo một interface visitor cho đối tượng đó các phương thức nếu sử dụng đối tượng
nào sẽ hiện thực hóa đối tượng đó. Khi thêm môt lớp đối tượng vào chỉ những phương thức
phụ thuộc vào đối tượng đó mới cần hiện thực hóa đối tượng. Vì lớp interface Visitor là một
lớp không có phương thức nên trong hàm accept ta phải ép kiểu cho lớp visitor. Chỉ những
phương thức đã hiện thực hóa lớp đối tượng tương ứng mới có thể được visit.



×