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 ShowThong
Trang 1BỘ 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
Trang 2Mục lục
1 Giới thiệu đề tài 2
1.1 Đặt vấn đề 2
1.2 Tổng quan 3
Định nghĩa 3
Khi nào nên sử dụng visitor pattern 3
2 Chi tiết về Visitor pattern 3
2.1 Sơ đồ và ý nghĩa 3
2.2 Ưu và nhược điểm 4
Ưu điểm 4
Nhược điểm 5
2.3 Các mẫu liên quan 6
2.4 Biến thể 7
Trang 31 Gi i thi u đ tài ới thiệu đề tài ệu đề tài ề tài
1.1 Đ t v n đ ặt vấn đề ấn đề ề tài
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
ShowThongTin() ThanhToan(km)
Phương tiện
ShowThongTin()
ThanhToan(km)
Xe máy
ShowThongTin() ThanhToan(km)
Oto 4 chỗ
ShowThongTin() ThanhToan(km)
Oto 7 chỗ
ShowThongTin() ThanhToan(km)
ThanhToanThe()
Phương tiện
ShowThongTin()
ThanhToan(km)
ThanhToanThe()
Xe máy
ShowThongTin() ThanhToan(km)
ThanhToanThe()
Oto 4 chỗ
ShowThongTin() ThanhToan(km)
ThanhToanThe()
Oto 7 chỗ
Trang 4Việ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
Trang 51.2.T ng quan ổng quan
Đ nh nghĩa ị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 ử dụng visitor pattern ụ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
Trang 62 Chi ti t v Visitor pattern ết về Visitor pattern ề tài 2.1 S đ và ý nghĩa ơ đồ và ý nghĩa ồ và ý nghĩa
Trang 7Visitor: 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
Trang 82.2 Ưu và nhược điểm u và nh ược điểm c đi m ểm
u đi m
Ưu và nhược điểm ể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
Trang 9Visitor 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 c đi m ể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 )
ThanhToan Visit ( XeMay ) Visit ( Oto4Slot ) Visit ( Oto7Slot )
XemThongTin
Visit ( XeMay )
Visit ( Oto4Slot )
Visit ( Oto7Slot )
ThanhToanThe Visit ( XeMay ) Visit ( Oto4Slot ) Visit ( Oto7Slot )
visit or Visit ( XeMay )
Visit ( Oto4Slot ) Visit
( Oto7Slot )
Visit ( MayBay)ThanhTo
an Visit ( XeMay )
Visit ( Oto4Slot ) Visit
( Oto7Slot )
Visit ( MayBay)
XemThong
Tin
Visit ( XeMay
)
Visit
( Oto4Slot )
Visit
( Oto7Slot )
Visit
( MayBay)
ThanhToanT he
Visit ( XeMay )
Visit ( Oto4Slot ) Visit
( Oto7Slot )
Visit ( MayBay)
Trang 102.3 Các m u liên quan ẫ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
Visit ( XeMay )
Visit ( Oto4Slot ) Visit
( Oto7Slot )
Visit ( MayBay)
Trang 11Cá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 ết về Visitor pattern ểm
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
Trang 12Vớ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