Bài giảng Lập trình hướng đối tượng - Chương 13: 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 13  
Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối  
tượng (Structural Patterns)  
13.1 Tổng quát về mẫu thiết kế HĐT  
13.2 Mẫu Adapter  
13.3 Mẫu Composite  
13.4 Mẫu Proxy  
13.5 Mẫu Decorator  
13.6 Mẫu Facade  
13.7 Mẫu Flyweight  
13.8 Kết chương  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 1  
13.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)  
5. 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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 2  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 3  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 4  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 5  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 6  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 7  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 8  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 9  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 10  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 11  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 12  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 13  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 14  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 15  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 16  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 17  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 18  
13.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();  
của Adaptee  
//gọi tác vụ có chức năng tương tự  
//₫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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 19  
13.2 Mẫu Adapter  
‰ Thí dụ trong class TextShape của chương trình DrawingEditor, tác  
vụ boundingBox() ₫ược viết như sau :  
ISize boundingBox() {  
//không cần có code prolog  
//gọi tác vụ cùng chức năng của ₫ối tượng gốc  
Rectangle rec = txtobj.getExtent();  
//code epilog sẽ chuyển ₫ổi ₫ịnh dạng kết quả  
ISize size = new Size();  
size.w = rec.width;  
size.h = rec.height;  
return size;  
}
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 20  
13.3 Mẫu Composite  
Mục tiêu :  
ƒ Tạo quan hệ bao gộp giữa các ₫ối tượng ₫ược dùng bởi module  
client. Client sẽ dùng ₫ối tượng bao gộp và ₫ối tượng bị bao gộp  
thông qua cùng 1 interface thống nhất, nhờ ₫ó ₫oạn code Client sẽ  
có tính tổng quát hóa cao, dễ phát triển, dễ bảo trì, không cần hiệu  
chỉnh khi các ₫ối tượng ₫ược sử dụng bị thay ₫ổi, thêm/bớt.  
Thí dụ về việc dùng mẫu Composite :  
ƒ Chương trình DrawingEditor vừa có các ₫ối tượng ₫ơn (không chứa  
₫ối tượng khác) như Line, Rectangle, Ellipse,… vừa có các ₫ối tượng  
tích hợp như Group chứa nhiều ₫ối tượng khác. Nhưng ₫oạn code xử  
lý của chương trình muốn dùng các ₫ối tượng thông qua cùng 1  
interface thống nhất ₫ể ₫ộc lập với số lượng và tính chất của các ₫ối  
tượng ₫ồ họa. Cách tốt nhất ₫ể giải quyết vấn ₫ề này là dùng mẫu  
Composite với lược ₫ồ class như sau  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 21  
13.3 Mẫu Composite  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 22  
13.3 Mẫu Composite  
Ta có thể xây dựng mẫu  
Composite theo loại object  
pattern ₫ể miêu tả mối quan hệ  
bao gộp giữa các ₫ối tượng.  
Lược ₫ồ class sẽ như sau :  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 23  
13.3 Mẫu Composite  
Các phần tử tham gia :  
ƒ IObject (IShape) : interface thống nhất của các ₫ối tượng ₫ược sử  
dụng, nó chứa 2 nhóm tác vụ : nhóm tác vụ chức năng của mọi  
₫ối tượng, nhóm tác vụ quản lý các ₫ối tượng thành phần (chỉ cần  
cho ₫ối tượng bao gộp).  
ƒ 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 IObject.  
ƒ AbstractObject (AbstractShape) : class trừu tượng, nhiệm vụ là  
hiện thực các tác vụ dùng chung bởi các ₫ối tượng con, thí dụ như  
nhóm tác vụ quản lý các ₫ối tượng thành phần ₫ể các class ₫ối  
tượng ₫ơn không cần hiện thực chúng (vì không có liên quan).  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 24  
13.3 Mẫu Composite  
Các phần tử tham gia :  
ƒ Leaf (Line) : class ₫ặc tả ₫ối tượng ₫ơ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 Composite.  
ƒ Composite (Group) : class ₫ặc tả ₫ối tượng tích hợp, ₫ây là class  
trọng tâm của mẫu. Ta chỉ tốn chi phí rất 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 :  
//template hiện thực từng tác vụ chức năng của class Composite  
func1() {  
//duyệt từng phần tử con và nhờ nó thực hiện func1()  
foreach obj in itemList  
obj.func1();  
}
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 25  
13.4 Mẫu Proxy  
Mục tiêu :  
ƒ Cung cấp ₫ối tượng ₫ại diện cho một ₫ối tượng khác (₫ối tượng  
cung cấp dịch vụ gốc) ₫ể hỗ trợ hoặc kiểm soát quá trình truy  
xuất ₫ối tượng gốc ₫ó. Đối tượng thay thế ₫ược gọi là Proxy.  
Có nhiều lý do ₫ể dùng mẫu Proxy, trong ₫ó có 4 lý do phổ biến sau  
₫ây :  
ƒ Việc khởi tạo những ₫ối tượng lớn và phức tạp sẽ tốn nhiều tài  
nguyên và thời gian, do ₫ó ta có khuynh hướng trì hoãn việc khởi  
tạo thực sự các ₫ối tượng này ₫ến khi thật cần thiết. Trong thời  
gian trì hoãn, ₫ối tượng proxy sẽ ₫óng vai trò thay thế ₫ối tượng  
gốc ₫ể phục vụ tạm các yêu cầu từ Client.  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 26  
13.4 Mẫu Proxy  
ƒ Chương trình muốn truy xuất một ₫ối tượng ở không gian ₫ịa chỉ  
khác, thí dụ ₫ối tượng nằm ở máy khác. Trong trường hợp này, ta  
sẽ tạo proxy chạy trên máy chương trình ứng dụng ₫ể ₫ại diện  
cho ₫ối tượng gốc trên máy ở xa.  
ƒ Đối tượng gốc cần ₫ược che chắn ₫ể Client không tương tác trực  
tiếp ₫ược hầu ₫ảm bảo ₫ộ bảo mật cao, Client chỉ giao tiếp trực  
tiếp ₫ược với Proxy, sau ₫ó Proxy chuyển yêu cầu của Client tới  
₫ối tượng gốc ₫ể thực hiện yêu cầu.  
ƒ Chương trình muốn kiểm soát, tăng cường, bổ sung một số tính  
năng của ₫ối tượng gốc. Proxy sẽ ₫óng vai trò ₫ối tượng thực hiện  
việc kiểm soát, tăng cường, bổ sung tính năng.  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 27  
13.4 Mẫu Proxy  
‰ Mỗi yêu cầu proxy trong 4 yêu cầu phổ biến trên ₫ược giải quyết bởi  
1 loại proxy tương ứng như sau :  
ƒ Virtual proxy : cung cấp ₫ối tượng ₫ại diện cho ₫ối tượng lớn và  
phức tạp. Mục ₫ích ₫ể trì hoãn thời ₫iểm tạo ₫ối tượng lớn (ví dụ  
₫ối tượng bitmap trong chương trình soạn thảo tài liệu MSWord).  
ƒ Remote proxy : cung cấp ₫ối tượng ₫ại diện (local) cho một ₫ối  
tượng từ xa (remote) (ví dụ RMI, JINI).  
ƒ Protection proxy : cung cấp ₫ối tượng ₫ại diện cho một ₫ối tượng  
khác cần ₫ược che chắn, bảo mật từ bên ngoài. Ví dụ các  
KernelProxies cung cấp dịch vụ truy xuất tới Kernel của hệ ₫iều  
hành.  
ƒ Smart proxy : cung cấp ₫ối tượng ₫ại diện ₫ể bổ sung một số tính  
năng của ₫ối tượng gốc.  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 28  
13.4 Mẫu Proxy  
Thí dụ về việc dùng mẫu Proxy :  
ƒ Chương trình MSWord quản lý tài liệu ₫ang soạn thảo trong ₫ối  
tượng Document, ₫ây là ₫ối tượng bao gộp nhiều ₫ối tượng thành  
phần theo dạng phân cấp. Mỗi lần user mở lại 1 file tài liệu, về  
nguyên tắc, chương trình sẽ ₫ọc toàn bộ nội dung của file ₫ể tạo  
lại ₫ầy ₫ủ các ₫ối tượng ₫ược chứa trong file ₫ó, nối kết chúng  
theo ₫úng cấu trúc gốc của ₫ối tượng Document trước khi hiển thị  
kết quả lên màn hình ₫ể người dùng xử lý tiếp. Tuy nhiên việc ₫ọc  
nội dung các ₫ối tượng lớn và phức tạp như hình bitmap, bảng dữ  
liệu lớn… vào bộ nhớ chương trình sẽ tốn nhiều thời gian. Hơn nữa  
mỗi lần chương trình chỉ hiển thị 1 phần rất nhỏ nội dung của tài  
liệu (1 trang màn hình) và chưa chắc gì user muốn làm việc tiếp  
với phần còn lại của tài liệu.  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 29  
13.4 Mẫu Proxy  
ƒ Do ₫ó chiến lược ₫ọc toàn bộ tài liệu từ file vào bộ nhớ 1 lần khi có  
yêu cầu của user là không tốt, vừa làm tăng thời gian ₫áp ứng với  
user, vừa phí phạm công sức trong trường hợp user chỉ xử lý 1  
phần rất nhỏ của tài liệu. Để 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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 30  
13.4 Mẫu Proxy  
Khoa Khoa học & Kỹ thuật Máy tính  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 31  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 32  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 33  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 34  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 35  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 36  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 37  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 38  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 39  
13.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  
Trường ĐH Bách Khoa Tp.HCM  
© 2010  
Môn : Lập trình hướng ₫ối tượng  
Chương 13 : Các mẫu thiết kế phục vụ tổ chức cấu trúc các ₫ối tượng  
Slide 40  
Tải về để xem bản đầy đủ
pdf 28 trang myanh 20900 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 13: 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

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_13_cac_mau_thiet.pdf