Bài giảng Các mẫu thiết kế hướng đối tượng - Chương 6: Các mẫu thiết kế phục vụ tổ chức cấu trúc các đối tượng (Structural Patterns)

6.1 Tổng quát về mẫu thiết kế HĐT

6.2 Mẫu Adapter

6.3 Mẫu Composite

6.4 Mẫu Proxy

6.5 Mẫu Decorator

6.6 Mẫu Facade

6.7 Mẫu Flyweight

6.8 Kết chương

pdf 62 trang phuongnguyen 8360
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Các mẫu thiết kế hướng đối tượng - Chương 6: Các mẫu thiết kế phục vụ tổ chức cấu trúc các đối tượng (Structural Patterns)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Các mẫu thiết kế hướng đối tượng - Chương 6: Các mẫu thiết kế phục vụ tổ chức cấu trúc các đối tượng (Structural Patterns)

Bài giảng Các mẫu thiết kế hướng đối tượng - Chương 6: Các mẫu thiết kế phục vụ tổ chức cấu trúc các đối tượng (Structural Patterns)
 Chương 6
Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối
 tượng (Structural Patterns)
 6.1 Tổng quát về mẫu thiết kế HĐT 
 6.2 Mẫu Adapter
 6.3 Mẫu Composite
 6.4 Mẫu Proxy
 6.5 Mẫu Decorator
 6.6 Mẫu Facade
 6.7 Mẫu Flyweight
 6.8 Kết chương
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 1
6.1 Tổng quát về mẫu thiết kế HĐT 
 Trong việc phát triển 1 phần mềm, ta thường thực hiện các hoạt
 ₫ộng chức năng sau ₫ây :
 1. Nắm bắt yêu cầu phần mềm
 2. Phân tích từng chức năng
 3. Thiết kế
 4. Hiện thực (hay viết code) 
 6. Kiểm thử
 Các hoạt ₫ộng trên có mối quan hệ phụ thuộc nhau, cụ thể kết
 quả của bước i là dữ liệu ₫ầu vào của bước thứ i+1. Do ₫ó nếu
 bước thứ i có lỗi, nghĩa là kết quả của nó không ₫úng thì sẽ kéo
 theo các bước sau ₫ó sẽ bị lỗi cho dù ta cố gắng thực hiện chúng
 tốt cách gì ₫i nữa. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 2
6.1 Tổng quát về mẫu thiết kế HĐT 
 Như vậy, lỗi ở bước ₫ầu tiên là nguy hại nhất, kế ₫ó là lỗi ở bước 
 thức 2, thứ 3, ... Tuy nhiên, các bước nắm bắt yêu cầu và phân 
 tích chức năng thường chỉ tạo ra kết quả ít, chưa có ₫ộ phức tạp 
 cao, do ₫ó ta vẫn có cách kiểm soát ₫ể những kết quả này ít có lỗi 
 nhất. Còn bắt ₫ầu từ bước thiết kế trở ₫i, kết quả sẽ nhiều và có 
 ₫ộ phức tạp cao hơn nên sẽ khó kiểm soát hơn. Và nếu có lỗi ở 
 bước này thì rất nguy hại vì sẽ kéo theo hoạt ₫ộng hiện thực 
 không có ý nghĩa gì nữa.
 Tóm lại, thiết kế phần mềm là một vấn ₫ề rất khó khăn, nhất là khi 
 phần mềm lớn, mối quan hệ giữa các phần tử sẽ nhiều và phức 
 tạp, bản thiết kế thường không hiệu quả và chứa nhiều lỗi khó 
 biết. Hơn nữa, ta thường phải trả giá cao cho các lỗi thiết kế vì 
 chúng ảnh hưởng nặng nề ₫ến các giai ₫oạn sau như viết code, 
 kiểm thử.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 3
6.1 Tổng quát về mẫu thiết kế HĐT 
 Dùng phương pháp thiết kế hướng ₫ối tượng sẽ giúp ta có thể thiết 
 kế ₫ược phần mềm có cấu trúc rõ ràng, mạch lạc, nhờ ₫ó ta dễ 
 phát hiện lỗi nếu có, dễ hiệu chỉnh, dễ nâng cấp từng thành phần 
 (thí dụ nhờ tính bao ₫óng, bao gộp, thừa kế, ₫a xạ, tổng quát 
 hóa). 
 Tuy nhiên việc thiết kế phần mềm HĐT còn phụ thuộc nhiều vào 
 khả năng người thiết kế, không phải ai thiết kế ₫ều tạo ₫ược 
 những kết quả tích cực như ₫ã nêu trên.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 4
6.1 Tổng quát về mẫu thiết kế HĐT 
 Hiện nay, hoạt ₫ộng thiết kế phần mềm là phải ₫ạt ₫ược 3 miêu 
 tiêu chính sau ₫ây (trong nhiều mục tiêu khác) :
 . Mục tiêu 1 : thiết kế ₫ược phần mềm giải quyết ₫úng các chức 
 năng mà user yêu cầu. Đây là mục tiêu chính yếu nhất.
 . Mục tiêu 2 : phải hạn chế ₫ược việc tái thiết kế lại trong tương 
 lai, cho dù vì lý do gì.
 . Mục tiêu 3 : bản thiết kế hiện hành phải hỗ trợ tốt nhất việc tái 
 thiết kế lại nếu vì lý do gì ₫ó phải tái thiết kế lại phần mềm.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 5
6.1 Tổng quát về mẫu thiết kế HĐT 
Có nhiều nguyên nhân dẫn ₫ến tái thiết kế phần mềm (PM) :
. Do PM phụ thuộc vào phần cứng, hệ ₫iều hành (OS) hay PM khác 
 : PM càng dùng trực tiếp các thông số phần cứng hay PM liên 
 quan sẽ phải thay ₫ổi khi các thông số này thay ₫ổi.
. Do PM phụ thuộc vào giải thuật : khi PM có nhiều giải pháp, nhiều 
 mức ₫ộ xử lý cho cùng một vấn ₫ề, việc ràng buộc chặt chẽ PM 
 với giải pháp cụ thể sẽ dẫn ₫ến khó bổ sung, thay ₫ổi PM.
. Do PM chưa có tính tổng quát hóa. Thí dụ tiện ích gỏ phím tiếng 
 Việt lúc ₫ầu chỉ hỗ trợ nhập liệu theo 1 cách gỏ cụ thể, nếu muốn 
 PM này hỗ trợ gỏ nhiều cách khác, ngay cả cách do user tự ₫ặt thì 
 phải thiết kế lại PM gỏ phím.
. Các thành phần của PM liên quan nhau quá chặt chẽ : hiệu chỉnh, 
 nâng cấp 1 thành phần thường phải thay ₫ổi các thành phần phụ 
 thuộc trực tiếp và gián tiếp nó theo kiểu dây chuyền.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 6
6.1 Tổng quát về mẫu thiết kế HĐT 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 7
6.1 Tổng quát về mẫu thiết kế HĐT 
 Một biện pháp ₫ược ₫ề xuất ₫ể có những bản thiết kế tốt, hạn chế 
 ₫ược việc tái thiết kế lại và khi cần thiết kế lại, nó phải hỗ trợ tốt 
 nhất việc tái thiết kế là sử dụng lại những mẫu thiết kế hướng ₫ối 
 tượng (Object Oriented Design Patterns), hay gọi tắt là mẫu thiết 
 kế (Design Patterns).
 Vậy mẫu thiết kế là gì ? Mẫu thiết kế có các ₫ặc ₫iểm sau : 
 . Là bản thiết kế của những người chuyên nghiệp và nổi tiếng, 
 ₫ã ₫ược sử dụng trong các phần mềm ₫ang ₫ược dùng phổ 
 biến và ₫ược người dùng ₫ánh giá tốt.
 . Giúp giải quyết 1 trong những vấn ₫ề thiết kế thường gặp trong 
 các phần mềm.
 . Giúp cho bản thiết kế phần mềm có tính uyển chuyển cao, dễ 
 hiệu chỉnh và dễ nâng cấp.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 8
6.1 Tổng quát về mẫu thiết kế HĐT 
Vai trò của mẫu thiết kế : mẫu thiết kế ₫óng 1 số vai trò chính yếu 
như sau : 
 . Cung cấp phương pháp giải quyết những vấn ₫ề thực tế 
 thường gặp trong phần mềm mà mọi người ₫ã ₫ánh giá, kiểm 
 nghiệm là rất tốt. 
 . Là biện pháp tái sử dụng tri thức các chuyên gia phần mềm.
 . Hình thành kho tri thức, ngữ vựng trong giao tiếp giữa những 
 người làm phần mềm.
 . Giúp ta tìm hiểu ₫ể nắm vững hơn ₫ặc ₫iểm ngôn ngữ lập trình 
 hướng ₫ối tượng.
Như vậy, nếu sử dụng triệt ₫ể các mẫu thiết kế trong việc thiết kế 
phần mềm mới, ta sẽ tiết kiệm ₫ược chi phí, thời gian và nguồn lực. 
Hơn nữa PM tạo ₫ược sẽ có ₫ộ tin cậy, uyển chuyển cao, dễ dàng 
hiệu chỉnh và nâng cấp sau này khi cần thiết.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 9
6.1 Tổng quát về mẫu thiết kế HĐT 
Phân loại các mẫu thiết kế : Dựa vào công dụng, ta có thể phân các 
mẫu thiết kế thành 3 nhóm chính : 
 . Structural (nhóm mẫu cấu trúc) : các mẫu này cung cấp cơ chế 
 ₫ể quản lý cấu trúc và mối quan hệ giữa các class, thí dụ ₫ể 
 dùng lại các class có sẵn (class thư viện, class của bên thứ ba 
 - third party,), ₫ể tạo mối ràng buộc thấp nhất giữa các class 
 (lower coupling) hay cung cấp các cơ chế thừa kế khác. 
 . Creational (nhóm mẫu phục vụ khởi tạo ₫ối tượng) : giúp khắc 
 phục các vấn ₫ề về khởi tạo ₫ối tượng, nhất là ₫ối tượng lớn và 
 phức tạp, hạn chế sự phụ thuộc của phần mềm vào platform 
 cấp thấp.
 . Behavioral (nhóm mẫu giải quyết hành vi của ₫ối tượng) : giúp 
 che dấu sự hiện thực của ₫ối tượng, che dấu giải thuật, hỗ trợ 
 việc thay ₫ổi cấu hình ₫ối tượng một cách linh.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 10
6.1 Tổng quát về mẫu thiết kế HĐT 
Phân loại các mẫu thiết kế : Còn nếu dựa vào loại phần tử ₫ược 
dùng trong mẫu, ta có thể phân các mẫu thiết kế thành 2 nhóm 
chính : 
 . Class patterns : nhóm mẫu thiết kế chỉ sử dụng các class và 
 mối quan hệ tĩnh giữa các class như thừa kế, hiện thực. Các 
 mối quan hệ này ₫ược xác ₫ịnh tại thời ₫iểm dịch, do ₫ó class 
 patterns thích hợp cho thành phần chức năng không cần thay 
 ₫ổi ₫ộng trong thời gian chạy.
 . Object patterns : nhóm mẫu thiết kế có dùng mối quan hệ giữa 
 các ₫ối tượng, mối quan hệ này rất ₫ộng vì dễ dàng thay ₫ổi 
 bất kỳ lúc nào trong lúc phần mềm chạy
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 11
6.1 Tổng quát về mẫu thiết kế HĐT 
 Trong phần còn lại của chương này, chúng ta sẽ giới thiệu 1 số 
 mẫu thiết kế có tần suất sử dụng lại trong các ứng dụng cao nhất, 
 mỗi mẫu thiết kế ta sẽ miêu tả các thông tin như : 
 . Tên gốc tiếng Anh của mẫu
 . Mục tiêu của mẫu
 . Thí dụ về sử dụng mẫu
 . Lược ₫ồ class miêu tả mẫu : chứa các phần tử (class, ₫ối 
 tượng) trong mẫu và mối quan hệ giữa chúng.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 12
6.2 Mẫu Adapter 
Mục tiêu :
 . Chuyển ₫ổi interface của một class chức năng có sẵn thành 
 một interface khác theo yêu cầu sử dụng của phần tử sử dụng 
 class ₫ó (ta gọi phần tử sử dụng là Client). 
 . Thật vậy, trong lập trình ₫ôi khi có những tình huống mà chúng 
 ta cần dùng một class có sẵn nhưng thông qua 1 interface 
 khác chứ không muốn thông qua interface của chính class ₫ó. 
 Mẫu Adapter giúp chúng ta giải quyết vấn ₫ề này
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 13
6.2 Mẫu Adapter 
Thí dụ về việc dùng mẫu Adapter :
. Ta muốn viết chương trình soạn thảo ₫ồ họa (DrawingEditor) cho 
 phép user vẽ các ₫ối tượng ₫ồ họa như Line, Rectangle, Ellipse, 
 Polygon, Text... Code quản lý các ₫ối tượng ₫ồ họa (ta gọi là 
 Client) xử lý chúng thông qua interface thống nhất là 
 IDrawingShape. Hiện thực các class Line, Rectangle, Ellipse, 
 Polygon từ ₫ầu khá dễ vì chúng là những ₫ối tượng ₫ơn giản 
 nhưng hiện thực class Text thì phức tạp hơn (giả sử class này có 
 khả năng hiển thị nội dung chuỗi trên nhiều dòng và có ₫ịnh dạng 
 phong phú). Giả sử chúng ta ₫ang lập trình trên platform có cung 
 cấp sẵn 1 class có tên là TextView, class này cung cấp chức năng 
 quản lý Text giống như chương trình muốn nhưng interface sử 
 dụng của nó là ITextView không giống với interface IDrawingShap 
 của chương trình. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 14
6.2 Mẫu Adapter 
Thí dụ về việc dùng mẫu Adapter :
. Việc thay ₫ổi interface IDrawingShape của chương trình thành 
 ITextView là không thể ₫ược vì ảnh hưởng ₫ến các class ₫ối tượng 
 ₫ồ họa khác ₫ã viết. Việc hiệu chỉnh lại class TextView ₫ể hỗ trợ 
 interface IDrawingShape của chương trình cũng không khả thi vì 
 TextView ₫ã ₫ược sử dụng bởi nhiều ứng dụng khác, hệ thống 
 không thể thay ₫ổi tùy tiện interface sử dụng của nó ₫ược.
. Cách tốt nhất ₫ể chương trình DrawingEditor của chúng ta có thể 
 dùng ₫ược class TextView mà không cần thay ₫ổi TextView cũng 
 chẳng cần thay ₫ổi mã nguồn của ứng dụng là dùng mẫu Adapter, 
 cụ thể ₫ịnh nghĩa class TextShape như là phần tử ₫ại diện cho 
 TextView, nó sẽ cung cấp ₫úng interface sử dụng mà chương trình 
 cần. Chúng ta sẽ thấy chi phí ₫ịnh nghĩa class TextShape là rất 
 thấp và ₫ộc lập với ₫ộ phức tạp của class TextView.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 15
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter thể hiện cách thức chương trình 
DrawingEditor sử dụng class TextView như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 16
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter thể hiện cách thức chương trình 
DrawingEditor sử dụng class TextView như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 17
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter dạng class pattern :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 18
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter dạng class pattern :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 19
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter dạng object pattern :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 20
6.2 Mẫu Adapter 
Lược ₫ồ class miêu tả mẫu Adapter dạng object pattern :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 21
6.2 Mẫu Adapter 
Các phần tử tham gia :
. IAdapter (IDrawingShape) : ₫ịnh nghĩa interface cho ₫oạn code 
 client sử dụng. 
. IAdaptee (ITextView) : ₫ịnh nghĩa interface của ₫ối tượng có sẵn 
 cần “chuyển” sang interface IAdapter. 
. Client (DrawingEditor) : ₫oạn code của chương trình có sử dụng 
 các ₫ối tượng thông qua interface IAdapter. 
. Adaptee (TextView) : class chức năng ₫ã có sẵn cần dùng trong 
 ₫oạn code client. 
. Adapter (TextShape) : class cần ₫ịnh nghĩa với chi phí rất thấp, 
 nhiệm vụ chuyển interface IAdaptee sang interface IAdapter
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 22
6.2 Mẫu Adapter 
 Ta nói việc ₫ịnh nghĩa class Adaper rất dễ dàng, vì từng tác vụ 
 của class này ₫ược viết theo template như sau : 
 Request() {
 //₫oạn code prolog (thường rất ngắn thậm chí không có)
 Adaptee.orig_request(); //gọi tác vụ có chức năng tương tự 
 của Adaptee
 //₫oạn code epilog (thường rất ngắn thậm chí không có)
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 23
6.2 Mẫu Adapter 
 Thí dụ trong class TextShape của chương trình DrawingEditor, tác 
 vụ boundingBox()  ...  Để khắc phục các nhược ₫iểm trên, ta sẽ 
 dùng mẫu Proxy. Cụ thể mỗi lần user mở 1 file tài liệu, ta chỉ nạp 
 trực tiếp các ₫ối tượng nhỏ của tài liệu vào bộ nhớ, còn các ₫ối 
 tượng lớn và phức tạp như bitmap, bảng dữ liệu, ta sẽ chỉ tạo ₫ối 
 tượng Proxy ₫ại diện cho chúng, ₫ối tượng Proxy sẽ chứa các 
 thông tin cơ bản, thiết yếu về ₫ối tượng gốc. Nhờ ₫ó, thời gian nạp 
 tài liệu (lần ₫ầu) sẽ rất nhanh và ₫áp ứng kịp thời user. Theo theo 
 thời gian, khi user lật tới trang nào, chương trình sẽ kiểm tra trang 
 ₫ó có chứa ₫ối tượng Proxy không, nếu có thì sẽ nhờ Proxy nạp 
 thật ₫ối tượng gốc trên file vào ₫ể user có thể làm việc trực tiếp với 
 ₫ối tượng gốc.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 36
6.4 Mẫu Proxy 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 37
6.4 Mẫu Proxy 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 38
6.4 Mẫu Proxy 
Ta có thể xây dựng mẫu Proxy theo loại object pattern ₫ể miêu tả mối 
quan hệ giữa proxy và ₫ối tượng gốc mà nó quản lý. 
Lược ₫ồ class sẽ như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 39
6.4 Mẫu Proxy 
Các phần tử tham gia :
. ISubject (IDocItem) : interface thống nhất của các ₫ối tượng ₫ược 
 sử dụng : ₫ối tượng gốc và ₫ối tượng proxy.
. Client (DocumentEditor) : ₫oạn code của chương trình có sử dụng 
 các ₫ối tượng thông qua interface thống nhất ISubject. 
. RealSubject (Image) : class ₫ặc tả ₫ối tượng gốc cần dùng bởi 
 client, chi phí ₫ặc tả nó phụ thuộc vào tính chất và chức năng của 
 nó, nhưng thường là rất lớn. Chi phí ₫ặc tả này ₫ộc lập với việc 
 dùng mẫu Proxy.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 40
6.4 Mẫu Proxy 
. Proxy (ImageProxy) : class ₫ặc tả ₫ối tượng proxy, ₫ây là class 
 trọng tâm của mẫu. Nó sẽ thay thế ₫ối tượng RealSubject trong 
 khoảng thời gian chưa cần ₫ối tượng RealSubject, nó giữ tham 
 khảo ₫ến ₫ối tượng RealSubject ₫ể nhờ vả khi cần, nó kiểm soát 
 quá trình truy xuất ₫ến ₫ối tượng RealSubject, có thể tạo hoặc 
 delete ₫ối tượng RealSubject. Tùy loại proxy mà ₫ối tượng Proxy 
 còn thực hiện 1 số hoạt ₫ộng khác nữa.
Ta chỉ tốn chi phí rất thấp ₫ể ₫ặc tả class Proxy vì từng tác vụ của 
 class này ₫ược viết theo template như sau : 
 request() {
 //prolog code, thường rất ngắn, thậm chí là không có
 realSubject.request(); //nếu cần, gọi ₫ối tượng gốc thực hiện
 //epilog code, thường rất ngắn, thậm chí là không có
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 41
6.4 Mẫu Proxy 
Quá trình giao tiếp ở thời ₫iểm run-time có thể mô tả bằng lược ₫ồ 
 ₫ối tượng như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 42
 6.5 Mẫu Decorator 
Mục tiêu :
 . Thêm ₫ộng 1 số trách nhiệm mới cho 1 ₫ối tượng cụ thể mà 
 không ảnh hưởng ₫ến các ₫ối tượng khác cùng chủng loại (cùng 
 class). 
 . Lưu ý là ₫ể thêm trách nhiệm cho toàn bộ các ₫ối tượng của 1 
 class, ta có thể dùng tính thừa kế hay thậm chí hiệu chỉnh trực 
 tiếp mã nguồn của class ₫ó
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 43
 6.5 Mẫu Decorator
Thí dụ về việc dùng mẫu Decorator :
. Chương trình DrawingEditor cho phép tạo và hiển thị nhiều ₫ối tượng 
 ₫ồ họa, trong ₫ó có ₫ối tượng TextView ₫ể hiển thị nội dung văn bản. 
 Giả sử TextView là ₫ối tượng hình chữ nhật với kích thước cố ₫ịnh do 
 user qui ₫ịnh, nó chỉ hiển thị nội dung văn bản trong hình chữ nhật do 
 nó quản lý chứ không có ₫ường viền bao quanh.
. Trong trường hợp user tạo 1 TextView mới, có thể họ muốn TextView 
 này có ₫ường viền bao quanh cho rõ ràng. Tương tự họ muốn 
 TextView hiển thị hình nền phía dưới nội dung văn bản và trong 
 trường hợp nội dung văn bản của TextView quá dài không thể ₫ược 
 hiển thị hết trong hình chữ nhật giới hạn của TextView thì user muốn 
 hiển thị thêm các scrollbar ngang và dọc ₫ể giúp user dời dễ dàng 
 ₫ến vị trí văn bản cần tập trung xử lý.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 44
6.5 Mẫu Decorator 
Cách tốt nhất ₫ể giải 
quyết các yêu cầu trên 
là dùng mẫu Decorator 
với lược ₫ồ class như 
sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 45
6.5 Mẫu Decorator 
Ta có thể xây dựng mẫu Decorator theo loại object pattern ₫ể miêu tả 
mối quan hệ giữa ₫ối tượng decore và ₫ối tượng gốc. Lược ₫ồ class sẽ 
như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 46
6.5 Mẫu Decorator 
Các phần tử tham gia :
. IComponent (IShape) : interface thống nhất của các ₫ối tượng ₫ược 
 sử dụng : ₫ối tượng gốc và ₫ối tượng decore cho ₫ối tượng gốc.
. Client (DrawingEditor) : ₫oạn code của chương trình có sử dụng các 
 ₫ối tượng thông qua interface thống nhất IComponent. 
. ConcreteComponent (TextView) : class ₫ặc tả ₫ối tượng gốc cần 
 dùng bởi client mà ta muốn decore cho nó, chi phí ₫ặc tả nó phụ 
 thuộc vào tính chất và chức năng của nó. Chi phí ₫ặc tả này ₫ộc lập 
 với việc dùng mẫu Decorator.
. AbstractDecorator (TextViewDecorator) : class trừu tượng, nhiệm vụ 
 là ₫ặc tả các thành phần dùng chung bởi các ₫ối tượng con, thí dụ 
 như tham khảo ₫ến ₫ối tượng cần decore, gởi thông ₫iệp gọi tác vụ 
 tương ứng của ₫ối tượng gốc
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 47
6.5 Mẫu Decorator 
Các phần tử tham gia :
. ConcreteDecorator1 (ScrollDecorator) : class ₫ặc tả ₫ối tượng 
 decorator cụ thể, ₫ây là class trọng tâm của mẫu. Nó sẽ ₫ại ₫iện 
 ₫ối tượng gốc ₫ể giao tiếp với Client, nó giữ tham khảo ₫ến ₫ối 
 tượng gốc ₫ể yêu cầu công việc tương ứng. Ta tốn chi phí khá 
 thấp ₫ể ₫ặc tả class này vì từng tác vụ của class này ₫ược viết 
 theo template như sau : 
 operation() {
 base.operation(); //gọi ₫ối tượng gốc thực hiện công việc trước
 AddedBehavior(); //decore thêm theo yêu cầu
 }
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 48
6.5 Mẫu Decorator 
Quá trình giao tiếp ở thời ₫iểm run-time có thể mô tả bằng lược ₫ồ 
 ₫ối tượng như sau :
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 49
 6.6 Mẫu Facade 
Mục tiêu :
 . cung cấp interface hợp nhất cho tập các interface của 1 hệ thống 
 con. Facade ₫ịnh nghĩa 1 interface cấp cao hơn các interface có 
 sẵn ₫ể làm cho hệ thống con dễ sử dụng hơn.
 . tối thiểu hóa tính "coupling" (nối ghép) giữa các hệ thống con. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 50
6.6 Mẫu Facade
Thí dụ về việc dùng mẫu Facade :
. hệ thống con phục vụ biên dịch có nhiều class phục vụ các bước 
 biên dịch rời rạc như Scanner, Parser, ProgramNode, 
 BytecodeStream, ProgramNodeBuilder. Để dịch source code, ta có 
 thể viết 1 ứng dụng gọi dịch vụ của từng class ₫ể duyệt token, 
 parser, xây dựng cây cú pháp, tạo code ₫ối tượng... Tuy nhiên làm 
 như trên sẽ rất khó và dễ gây ra lỗi. Cách khắc phục là ₫ịnh nghĩa 1 
 class mới với giao tiếp hợp nhất tên là Compiler, nó cung cấp 1 hàm 
 Compile (file), ứng dụng nào cần dịch source code chỉ cần gởi 
 thông ₫iệp Compile ₫ến ₫ối tượng Compiler. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 51
6.6 Mẫu Facade 
 Compiler
 Compile()
 Scanner Token
 Stream
 Parser Symbol
 BytecodeStream ProgramNodeBuffer ProgramNode
 CodeGenerator
 StatementNode
 ExpressionNode
 StackMachineCodeGenerator RISCCodeGenerator VariableNode
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 52
6.6 Mẫu Facade 
 Facade
 Subsystem class
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 53
6.6 Mẫu Facade 
Các phần tử tham gia :
. Facade (Compiler)
 biết class nào liên quan ₫ến request xác ₫ịnh. 
 nhờ các ₫ối tượng liên quan thực hiện request.
. subsystem classe (Scanner, Parser,..)
 hiện thực một chức năng cụ thể của hệ thống con. 
 xử lý công việc ₫ược ₫ối tượng Façade nhờ. 
 không cần biết Facade, không có tham khảo ₫ến Facade. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 54
6.7 Mẫu Flyweight 
Mục tiêu :
 . dùng phương tiện dùng chung ₫ể quản lý hiệu quả 1 số rất lớn 
 ₫ối tượng có nhiều thành phần giống nhau.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 55
6.7 Mẫu Flyweight
Thí dụ về việc dùng mẫu Flyweight :
. Chương trình xử lý văn bản dùng khái niệm ₫ối tượng ₫ể miêu tả bất 
 kỳ phần tử cơ bản nào : ký tự, công thức, hình, .... Ký tự là ₫ối tượng 
 xuất hiện rất nhiều lần trong văn bản, nếu ta miêu tả ₫ối tượng ký tự 
 chứa trực tiếp tất cả các thông tin về nó như mã ký tự, tên font, kích 
 cỡ, màu, biến thể (normal, bold, italic,), thì mỗi ₫ối tượng ký tự sẽ 
 chiếm nhiều không gian, như vậy việc lưu giữ các ₫ối tượng ký tự sẽ 
 rất không hiệu quả. Mẫu Flyweight rất thích hợp ₫ể giải quyết vấn 
 ₫ề miêu tả ₫ối tượng ký tự.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 56
6.7 Mẫu Flyweight
Thí dụ về việc dùng mẫu Flyweight :
. Flyweight là ₫ối tượng dùng chung dựa vào khái niệm cơ bản là các 
 thuộc tính của nó có thể ₫ược chia làm 2 loại : 
 trạng thái trong : các thuộc tính ₫ộc lập với ngữ cảnh sử dụng, 
 thí dụ ₫ối tượng ký tự có code ký tự là trạng thái trong.
 trạng thái ngoài : các thuộc tính phụ thuộc và thay ₫ổi theo ngữ 
 cảnh, thí dụ ₫ối tượng ký tự có thuộc tính tên font, kích cỡ, màu, 
 biến thể, là trạng thái ngoài. Ta không nên chứa trạng thái 
 ngoài trực tiếp trong ₫ối tượng mà nên gom chúng trong 1 ₫ối 
 tượng khác, flyweight chỉ chứa tham khảo ₫ến ₫ối tượng chứa 
 trạng thái ngoài.
. Đối tượng chứa trạng thái ngoài thường ₫ược dùng chung bởi nhiều 
 flyweight khác nhau. 
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 57
6.7 Mẫu Flyweight 
 Miêu tả các ₫ối tượng ký tự 1 cách bình thường
 Code (N) Code (g) Code (u) Code (y) Code (ễ) Code (n)
 Các thông số Các thông số Các thông số Các thông số Các thông số Các thông số 
 hiển thị hiển thị hiển thị hiển thị hiển thị hiển thị
  Miêu tả các ₫ối tượng ký tự dùng mẫu Flyweight giúp dùng chung
 các thông số hiển thị bởi rất nhiều ký tự có cùng cách thức hiển
 thị.
 Code (N) Code (g) Code (u) Code (y) Code (ễ) Code (n)
 Các thông số 
 hiển thị
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 58
6.7 Mẫu Flyweight 
 Miêu tả các ₫ối tượng ký tự trong MS Word (dùng mẫu Flyweight
 và array)
 i i+1 i+2 i+3 i+4 i+5
  Code (N) Code (N) Code (N) Code (N) Code (N) Code (N) 
 Các thông số 
 i, i+5 hiển thị
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 59
6.7 Mẫu Flyweight 
 FlyweightFactory Flyweight
 GetFlyweight(key) Operation(extrinsicState)
 if (flyweight(key) exists 
 return existing flyweight
 else {
 create new flyweight;
 add it to pool of flyweights;
 return the new flyweight;
 }
 ConcreteFlyweight UnsharedConcreteFlyweight
 Operation(extrinsicState) Operation(extrinsicState)
 intrinsicState allState
 Client
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 60
6.7 Mẫu Facade 
Các phần tử tham gia :
. Flyweight (Glyph) : ₫ịnh nghĩa interface cho ₫ối tượng nhận yêu cầu 
 và hoạt ₫ộng theo trạng thái ngoài. 
. ConcreteFlyweight (Character) : hiện thực interface Flyweight thành 
 các ₫ối tượng dùng chung. 
. UnsharedConcreteFlyweight (Character) : hiện thực interface 
 Flyweight thành các ₫ối tượng không dùng chung. 
. FlyweightFactory : tạo và quản lý các ₫ối tượng Flyweight. 
. Client : chứa tham khảo ₫ến flyweight và nhờ khi cần.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 61
6.8 Kết chương
 Chương này ₫ã giới thiệu các thông tin cơ bản về mẫu thiết kế
 hướng ₫ối tượng và miêu tả mục tiêu, tính chất của các mẫu thiết
 kế phục vụ cấu trúc các ₫ối tượng như Adapter, Composite,
 Proxy, Decorator, Facade, Flyweight.
 Khoa Khoa học & Kỹ thuật Máy tính Môn : Các mẫu thiết kế hướng ₫ối tượng
 Trường ĐH Bách Khoa Tp.HCM Chương 6 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng
 © 2010 Slide 62

File đính kèm:

  • pdfbai_giang_cac_mau_thiet_ke_huong_doi_tuong_chuong_6_cac_mau.pdf