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)
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
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
Tóm tắt nội dung 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)
Chương 13
Các mẫuthiếtkế phụcvụ tổ chứccấu trúc các ₫ối
tượng (Structural Patterns)
13.1 Tổng quát về mẫuthiếtkế HĐT
13.2 MẫuAdapter
13.3 Mẫu Composite
13.4 MẫuProxy
13.5 Mẫu Decorator
13.6 Mẫu Facade
13.7 Mẫu Flyweight
13.8 Kếtchương
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 1
13.1 Tổng quát về mẫuthiếtkế HĐT
Trong việc phát triển1 phầnmềm, ta thường thựchiện các hoạt
₫ộng chứcnăng sau ₫ây :
1. Nắmbắtyêucầuphầnmềm
2. Phân tích từng chứcnăng
3. Thiếtkế
4. Hiệnthực (hay viết code)
5. Kiểmthử
Các hoạt ₫ộng trên có mối quan hệ phụ thuộc nhau, cụ thể kết
quả củabướci làdữ liệu ₫ầuvàocủabướcthứ i+1. Do ₫ónếu
bướcthứ i có lỗi, nghĩalàkếtquả củanókhông₫úng thì sẽ kéo
theo các bướcsau₫ósẽ bị lỗichodùtacố gắng thựchiện chúng
tốtcáchgì₫inữa.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 2
13.1 Tổng quát về mẫuthiếtkế HĐT
Như vậy, lỗi ở bước ₫ầutiênlànguyhạinhất, kế₫ólàlỗi ở bước
thức2, thứ 3, ... Tuy nhiên, các bướcnắmbắtyêucầu và phân
tích chứcnăng thường chỉ tạorakếtquả ít, chưacó₫ộ phứctạp
cao, do ₫ótavẫncócáchkiểm soát ₫ể những kếtquả này ít có lỗi
nhất. Còn bắt ₫ầutừ bướcthiếtkế trở₫i, kếtquả sẽ nhiềuvàcó
₫ộ phứctạpcaohơn nên sẽ khó kiểm soát hơn. Và nếucólỗi ở
bước này thì rất nguy hạivìsẽ kéo theo hoạt ₫ộng hiệnthực
không có ý nghĩagìnữa.
Tóm lại, thiếtkế phầnmềmlàmộtvấn ₫ề rấtkhókhăn, nhấtlàkhi
phầnmềmlớn, mối quan hệ giữa các phầntử sẽ nhiềuvàphức
tạp, bảnthiếtkế thường không hiệuquả và chứanhiềulỗikhó
biết. Hơnnữa, ta thường phảitrả giá cao cho các lỗithiếtkế vì
chúng ảnh hưởng nặng nề₫ến các giai ₫oạn sau như viết code,
kiểmthử.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 3
13.1 Tổng quát về mẫuthiếtkế HĐT
Dùng phương pháp thiếtkế hướng ₫ốitượng sẽ giúp ta có thể thiết
kế ₫ượcphầnmềmcócấu trúc rõ ràng, mạch lạc, nhờ₫ótadễ
phát hiệnlỗinếucó, dễ hiệuchỉnh, dễ nâng cấptừng thành phần
(thí dụ nhờ tính bao ₫óng, bao gộp, thừakế, ₫axạ, tổng quát
hóa).
Tuy nhiên việcthiếtkế phầnmềm HĐT còn phụ thuộcnhiềuvào
khả năng ngườithiếtkế, không phảiaithiếtkế₫ềutạo ₫ược
những kếtquả tích cựcnhư₫ã nêu trên.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 4
13.1 Tổng quát về mẫuthiếtkế HĐT
Hiệnnay, hoạt ₫ộng thiếtkế phầnmềmlàphải ₫ạt ₫ược3 miêu
tiêu chính sau ₫ây (trong nhiềumục tiêu khác) :
Mục tiêu 1 : thiếtkế ₫ượcphầnmềmgiảiquyết ₫úng các chức
năng mà user yêu cầu. Đây là mục tiêu chính yếunhất.
Mục tiêu 2 : phảihạnchế ₫ượcviệctáithiếtkế lại trong tương
lai, cho dù vì lý do gì.
Mục tiêu 3 : bảnthiếtkế hiệnhànhphảihỗ trợ tốtnhấtviệctái
thiếtkế lạinếu vì lý do gì ₫óphảitáithiếtkế lạiphầnmềm.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 5
13.1 Tổng quát về mẫuthiếtkế HĐT
Có nhiều nguyên nhân dẫn ₫ếntáithiếtkế phầnmềm (PM) :
Do PM phụ thuộc vào phầncứng, hệ₫iều hành (OS) hay PM khác
: PM càng dùng trựctiếp các thông số phầncứ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ảithuật : khi PM có nhiềugiải pháp, nhiều
mức ₫ộ xử lý cho cùng mộtvấn ₫ề, việc ràng buộcchặtchẽ PM
vớigiải pháp cụ thể sẽ dẫn ₫ếnkhóbổ sung, thay ₫ổiPM.
Do PM chưacótínhtổng quát hóa. Thí dụ tiện ích gỏ phím tiếng
Việtlúc₫ầuchỉ hỗ trợ nhậpliệu theo 1 cách gỏ cụ thể, nếumuốn
PM này hỗ trợ gỏ nhiều cách khác, ngay cả cách do user tự₫ặtthì
phảithiếtkế lạiPM gỏ phím.
Các thành phầncủa PM liên quan nhau quá chặtchẽ : hiệuchỉnh,
nâng cấp 1 thành phầnthường phải thay ₫ổicácthànhphầnphụ
thuộctrựctiếpvàgiántiếpnótheokiểu dây chuyền.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 6
13.1 Tổng quát về mẫuthiếtkế HĐT
Mộtbiện pháp ₫ược ₫ề xuất ₫ể có những bảnthiếtkế tốt, hạnchế
₫ượcviệctáithiếtkế lạivàkhicầnthiếtkế lại, nó phảihỗ trợ tốt
nhấtviệctáithiếtkế là sử dụng lạinhững mẫuthiếtkế hướng ₫ối
tượng (Object Oriented Design Patterns), hay gọitắtlàmẫuthiết
kế (Design Patterns).
Vậymẫuthiếtkế là gì ? Mẫuthiếtkế có các ₫ặc ₫iểmsau:
Là bảnthiếtkế củanhững người chuyên nghiệpvànổitiếng,
₫ã ₫ượcsử dụng trong các phầnmềm ₫ang ₫ượcdùngphổ
biếnvà₫ượcngười dùng ₫ánh giá tốt.
Giúp giải quyết 1 trong những vấn ₫ề thiếtkế thường gặptrong
các phầnmềm.
Giúp cho bảnthiếtkế phầnmềmcótínhuyển chuyểncao, dễ
hiệuchỉnh và dễ nâng cấp.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 7
13.1 Tổng quát về mẫuthiếtkế HĐT
Vai trò củamẫuthiếtkế : mẫuthiếtkế₫óng 1 số vai trò chính yếu
như sau :
Cung cấpphương pháp giải quyếtnhững vấn ₫ề thựctế
thường gặp trong phầnmềmmàmọingười ₫ã ₫ánh giá, kiểm
nghiệmlàrấttốt.
Là biệnpháptáisử dụng tri thức các chuyên gia phầnmềm.
Hình thành kho tri thức, ngữ vựng trong giao tiếpgiữanhững
người làm phầnmềm.
Giúp ta tìm hiểu ₫ể nắmvững hơn ₫ặc ₫iểm ngôn ngữ lậptrình
hướng ₫ốitượng.
Như vậy, nếusử dụng triệt ₫ể các mẫuthiếtkế trong việcthiếtkế
phầnmềmmới, ta sẽ tiếtkiệm ₫ược chi phí, thời gian và nguồnlực.
HơnnữaPM tạo ₫ượcsẽ có ₫ộ tin cậy, uyển chuyểncao, dễ dàng
hiệuchỉnh và nâng cấp sau này khi cầnthiết.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 8
13.1 Tổng quát về mẫuthiếtkế HĐT
Phân loạicácmẫuthiếtkế : Dựa vào công dụng, ta có thể phân các
mẫuthiếtkế thành 3 nhóm chính :
Structural (nhóm mẫucấutrúc): các mẫu này cung cấpcơ chế
₫ể quảnlýcấutrúcvà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ạomối ràng buộcthấpnhấtgiữa các class
(lower coupling) hay cung cấpcáccơ chế thừakế khác.
Creational (nhóm mẫuphụcvụ khởitạo ₫ốitượng) : giúp khắc
phụccácvấn ₫ề về khởitạo ₫ốitượng, nhấtlà₫ốitượng lớnvà
phứctạp, hạnchế sự phụ thuộccủaphầnmềm vào platform
cấpthấp.
Behavioral (nhóm mẫugiải quyết hành vi của ₫ốitượng) : giúp
che dấusự hiệnthựccủa ₫ốitượng, che dấugiảithuật, hỗ trợ
việc thay ₫ổicấuhình₫ốitượng một cách linh.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 9
13.1 Tổng quát về mẫuthiếtkế HĐT
Phân loạicácmẫuthiếtkế : Còn nếudựavàoloạiphầntử ₫ược
dùng trong mẫu, ta có thể phân các mẫuthiếtkế thành 2 nhóm
chính :
Class patterns : nhóm mẫuthiếtkế chỉ sử dụng các class và
mối quan hệ tĩnh giữa các class như thừakế, hiệnthực. Các
mối quan hệ này ₫ượcxác₫ịnh tạithời ₫iểmdịch, do ₫ó class
patterns thích hợp cho thành phầnchứcnăng không cần thay
₫ổi ₫ộng trong thờigianchạy.
Object patterns : nhóm mẫuthiếtkế có dùng mối quan hệ giữa
các ₫ốitượng, mối quan hệ này rất ₫ộng vì dễ dàng thay ₫ổi
bấtkỳ lúc nào trong lúc phầnmềmchạy
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 10
13.1 Tổng quát về mẫuthiếtkế HĐT
Trong phầncònlạicủachương này, chúng ta sẽ giớithiệu1 số
mẫuthiếtkế có tầnsuấtsử dụng lại trong các ứng dụng cao nhất,
mỗimẫuthiếtkế ta sẽ miêu tả các thông tin như :
Tên gốctiếng Anh củamẫu
Mụctiêucủamẫu
Thí dụ về sử dụng mẫu
Lược ₫ồ class miêu tả mẫu: chứa các phầntử (class, ₫ối
tượng) trong mẫuvàmối quan hệ giữa chúng.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 11
13.2 Mẫu Adapter
Mụctiêu:
Chuyển ₫ổi interface củamột class chứcnăng có sẵnthành
một interface khác theo yêu cầusử dụng củaphầntử sử dụng
class ₫ó(tagọiphầntử sử dụng là Client).
Thậtvậy, trong lậptrình₫ôi khi có những tình huống mà chúng
ta cần dùng một class có sẵnnhư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ảiquyếtvấn ₫ề này
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 12
13.2 Mẫu Adapter
Thí dụ về việcdùngmẫu Adapter :
Ta muốnviếtchương trình soạnthảo ₫ồ họa (DrawingEditor) cho
phép user vẽ các ₫ốitượng ₫ồ họanhư Line, Rectangle, Ellipse,
Polygon, Text... Code quảnlýcác₫ốitượng ₫ồ họa(tagọilà
Client) xử lý chúng thông qua interface thống nhấtlà
IDrawingShape. Hiệnthực các class Line, Rectangle, Ellipse,
Polygon từ₫ầukhádễ vì chúng là những ₫ốitượng ₫ơngiản
nhưng hiệnthực class Text thì phứctạphơn(giả sử class này có
khả năng hiểnthị 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ấpsẵn 1 class có tên là TextView, class này cung cấpchứcnăng
quản lý Text giống như chương trình muốnnhưng interface sử
dụng củanólàITextViewkhônggiống với interface IDrawingShap
củachương trình.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 13
13.2 Mẫu Adapter
Thí dụ về việcdùngmẫu Adapter :
Việc thay ₫ổi interface IDrawingShape củachương trình thành
ITextView là không thể ₫ượcvìảnh hưởng ₫ến các class ₫ốitượng
₫ồ họa khác ₫ãviết. Việchiệuchỉnh lại class TextView ₫ể hỗ trợ
interface IDrawingShape củachương trình cũng không khả thi vì
TextView ₫ã ₫ượcsử dụng bởi nhiều ứng dụng khác, hệ thống
không thể thay ₫ổitùytiện interface sử dụng củanó₫ược.
Cách tốtnhất ₫ể chương trình DrawingEditor của chúng ta có thể
dùng ₫ược class TextView mà không cần thay ₫ổiTextViewcũng
chẳng cần thay ₫ổi mã nguồncủa ứng dụng là dùng mẫu Adapter,
cụ thể₫ịnh nghĩa class TextShape như là phầntử₫ạidiệncho
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ấpvà₫ộclậpvới ₫ộ phứctạpcủa class TextView.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 14
13.2 Mẫu Adapter
Lược ₫ồ class miêu tả mẫu Adapter thể hiệncáchthứcchương trình
DrawingEditor sử dụng class TextView như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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 Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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 Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 17
13.2 Mẫu Adapter
Các phầntử tham gia :
IAdapter (IDrawingShape) : ₫ịnh nghĩa interface cho ₫oạn code
client sử dụng.
IAdaptee (ITextView) : ₫ịnh nghĩa interface của ₫ốitượng có sẵn
cần “chuyển” sang interface IAdapter.
Client (DrawingEditor) : ₫oạn code củachương trình có sử dụng
các ₫ốitượng thông qua interface IAdapter.
Adaptee (TextView) : class chứcnăng ₫ãcósẵncần dùng trong
₫oạn code client.
Adapter (TextShape) : class cần ₫ịnh nghĩavới chi phí rấtthấp,
nhiệmvụ chuyển interface IAdaptee sang interface IAdapter
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 18
13.2 Mẫu Adapter
Ta nói việc ₫ịnh nghĩa class Adaper rấtdễ dàng, vì từng tác vụ
của class này ₫ượcviết theo template như sau :
Request() {
//₫oạn code prolog (thường rấtngắnthậm chí không có)
Adaptee.orig_request(); //gọitácvụ có chứcnăng tương tự
của Adaptee
//₫oạn code epilog (thường rấtngắnthậm chí không có)
}
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 19
13.2 Mẫu Adapter
Thí dụ trong class TextShape củachương trình DrawingEditor, tác
vụ boundingBox() ₫ượcviếtnhư sau :
ISize boundingBox() {
//không cần có code prolog
//gọitácvụ cùng chứcnăng của ₫ốitượng gốc
Rectangle rec = txtobj.getExtent();
//code epilog sẽ chuyển ₫ổi ₫ịnh dạng kếtquả
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 Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 20
13.3 Mẫu Composite
Mụctiêu:
Tạo quan hệ bao gộpgiữacác₫ốitượng ₫ược dùng bởi module
client. Client sẽ dùng ₫ốitượng bao gộpvà₫ốitượ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ầnhiệu
chỉnh khi các ₫ốitượng ₫ượcsử dụng bị thay ₫ổi, thêm/bớt.
Thí dụ về việcdùngmẫu Composite :
Chương trình DrawingEditor vừacócác₫ốitượng ₫ơn(khôngchứa
₫ốitượng khác) như Line, Rectangle, Ellipse, vừacócác₫ốitượng
tích hợpnhư Group chứanhiều ₫ốitượng khác. Nhưng ₫oạn code xử
lý củachương trình muốn dùng các ₫ốitượng thông qua cùng 1
interface thống nhất ₫ể ₫ộclậpvớisố lượng và tính chấtcủacác₫ối
tượng ₫ồ họa. Cách tốtnhất ₫ể giải quyếtvấn ₫ề này là dùng mẫu
Composite vớilược ₫ồ class như sau
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 21
13.3 Mẫu Composite
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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ộpgiữacác₫ốitượng.
Lược ₫ồ class sẽ như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 23
13 ... heo dạng phân cấp. Mỗilầ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 ₫ốitượng ₫ượcchứa trong file ₫ó, nốikếtchúng
theo ₫úng cấutrúcgốccủa ₫ốitượng Document trướckhihiểnthị
kếtquả 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 ₫ốitượng lớnvàphứctạpnhư hình bitmap, bảng dữ
liệulớn vào bộ nhớ chương trình sẽ tốn nhiềuthờigian. Hơnnữa
mỗilầnchương trình chỉ hiểnthị 1 phầnrấtnhỏ nội dung củatài
liệu (1 trang màn hình) và chưachắc gì user muốnlàmviệctiếp
vớiphầncònlạicủatàiliệu.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 29
13.4 MẫuProxy
Do ₫óchiếnlược ₫ọc toàn bộ tài liệutừ file vào bộ nhớ 1 lầnkhicó
yêu cầucủauser làkhôngtốt, vừalàmtăng thờigian₫á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ầnrấtnhỏ củatàiliệu. Để khắcphụccácnhược ₫iểm trên, ta sẽ
dùng mẫu Proxy. Cụ thể mỗilần user mở 1 file tài liệu, ta chỉ nạp
trựctiếpcác₫ốitượng nhỏ củatàiliệuvàobộ nhớ, còn các ₫ối
tượng lớnvàphứctạpnhư bitmap, bảng dữ liệu, ta sẽ chỉ tạo ₫ối
tượng Proxy ₫ạidiện cho chúng, ₫ốitượng Proxy sẽ chứacác
thông tin cơ bản, thiếtyếuvề₫ốitượng gốc. Nhờ₫ó, thờigiannạp
tài liệu(lần ₫ầu) sẽ rất nhanh và ₫áp ứng kịpthời user. Theo theo
thời gian, khi user lậttới trang nào, chương trình sẽ kiểmtratrang
₫ócóchứa ₫ốitượng Proxy không, nếucóthìsẽ nhờ Proxy nạp
thật ₫ốitượng gốc trên file vào ₫ể user có thể làm việctrựctiếpvới
₫ốitượng gốc.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 30
13.4 Mẫu Proxy
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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à ₫ốitượng gốcmànóquản lý.
Lược ₫ồ class sẽ như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 32
13.4 Mẫu Proxy
Các phầntử tham gia :
ISubject (IDocItem) : interface thống nhấtcủacác₫ốitượng ₫ược
sử dụng : ₫ốitượng gốcvà₫ốitượng proxy.
Client (DocumentEditor) : ₫oạn code củachương trình có sử dụng
các ₫ốitượng thông qua interface thống nhất ISubject.
RealSubject (Image) : class ₫ặctả₫ốitượng gốccần dùng bởi
client, chi phí ₫ặctả nó phụ thuộc vào tính chấtvàchứcnăng của
nó, nhưng thường là rấtlớn. Chi phí ₫ặctả này ₫ộclậpvớiviệc
dùng mẫu Proxy.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 33
13.4 Mẫu Proxy
Proxy (ImageProxy) : class ₫ặctả₫ốitượng proxy, ₫ây là class
trọng tâm củamẫu. Nó sẽ thay thế₫ốitượng RealSubject trong
khoảng thờigianchưacần ₫ốitượng RealSubject, nó giữ tham
khảo ₫ến ₫ốitượng RealSubject ₫ể nhờ vả khi cần, nó kiểm soát
quá trình truy xuất ₫ến ₫ốitượng RealSubject, có thể tạohoặc
delete ₫ốitượng RealSubject. Tùy loại proxy mà ₫ốitượng Proxy
còn thựchiện1 số hoạt ₫ộng khác nữa.
Ta chỉ tốn chi phí rấtthấp ₫ể ₫ặctả class Proxy vì từng tác vụ của
class này ₫ượcviết theo template như sau :
request() {
//prolog code, thường rấtngắn, thậm chí là không có
realSubject.request(); //nếucần, gọi ₫ốitượng gốcthựchiện
//epilog code, thường rấtngắn, thậm chí là không có
}
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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 ₫ồ
₫ốitượng như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 35
13.5 Mẫu Decorator
Mụctiêu:
Thêm ₫ộng 1 số trách nhiệmmới cho 1 ₫ốitượng cụ thể mà
không ảnh hưởng ₫ếncác₫ốitượ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 ₫ốitượng của1
class, ta có thể dùng tính thừakế hay thậm chí hiệuchỉnh trực
tiếpmãnguồncủa class ₫ó
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 36
13.5 Mẫu Decorator
Thí dụ về việcdùngmẫu Decorator :
Chương trình DrawingEditor cho phép tạovàhiểnthị nhiều ₫ốitượng
₫ồ họa, trong ₫ócó₫ốitượng TextView ₫ể hiểnthị nội dung vănbản.
Giả sử TextView là ₫ốitượng hình chữ nhậtvớikíchthướccố₫ịnh do
user qui ₫ịnh, nó chỉ hiểnthị nội dung vănbản trong hình chữ nhật do
nó quảnlýchứ không có ₫ường viền bao quanh.
Trong trường hợpuser tạo1 TextViewmới, có thể họ muốnTextView
này có ₫ường viền bao quanh cho rõ ràng. Tương tự họ muốn
TextView hiểnthị hình nền phía dướinội dung vănbản và trong
trường hợpnội dung vănbảncủa TextView quá dài không thể₫ược
hiểnthị hết trong hình chữ nhậtgiớihạncủa TextView thì user muốn
hiểnthị thêm các scrollbar ngang và dọc ₫ể giúp user dờidễ dàng
₫ếnvị trí vănbảncầntập trung xử lý.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 37
13.5 Mẫu Decorator
Cách tốtnhất ₫ể giải
quyếtcácyêucầutrên
là dùng mẫu Decorator
vớilược ₫ồ class như
sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 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 ₫ốitượng decore và ₫ốitượng gốc. Lược ₫ồ class sẽ
như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 39
13.5 Mẫu Decorator
Các phầntử tham gia :
IComponent (IShape) : interface thống nhấtcủacác₫ốitượng ₫ược
sử dụng : ₫ốitượng gốcvà₫ốitượng decore cho ₫ốitượng gốc.
Client (DrawingEditor) : ₫oạn code củachương trình có sử dụng các
₫ốitượng thông qua interface thống nhất IComponent.
ConcreteComponent (TextView) : class ₫ặctả₫ốitượng gốccần
dùng bởi client mà ta muốn decore cho nó, chi phí ₫ặctả nó phụ
thuộc vào tính chấtvàchứcnăng của nó. Chi phí ₫ặctả này ₫ộclập
vớiviệcdùngmẫu Decorator.
AbstractDecorator (TextViewDecorator) : class trừutượng, nhiệmvụ
là ₫ặctả các thành phần dùng chung bởicác₫ốitượng con, thí dụ
như tham khảo ₫ến ₫ốitượng cần decore, gởi thông ₫iệpgọitácvụ
tương ứng của ₫ốitượng gốc
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 40
13.5 Mẫu Decorator
Các phầntử tham gia :
ConcreteDecorator1 (ScrollDecorator) : class ₫ặctả₫ốitượng
decorator cụ thể, ₫ây là class trọng tâm củamẫu. Nó sẽ₫ại ₫iện
₫ốitượng gốc ₫ể giao tiếpvới Client, nó giữ tham khảo ₫ến ₫ối
tượng gốc ₫ể yêu cầu công việctương ứng. Ta tốn chi phí khá
thấp ₫ể ₫ặctả class này vì từng tác vụ của class này ₫ượcviết
theo template như sau :
operation() {
base.operation(); //gọi ₫ốitượng gốcthựchiệncôngviệctrước
AddedBehavior(); //decore thêm theo yêu cầu
}
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 41
13.5 Mẫu Decorator
Quá trình giao tiếp ở thời ₫iểm run-time có thể mô tả bằng lược ₫ồ
₫ốitượng như sau :
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 42
13.6 Mẫu Facade
Mụctiêu:
cung cấp interface hợpnhấtchotập các interface của1 hệ thống
con. Facade ₫ịnh nghĩa 1 interface cấpcaohơn các interface có
sẵn ₫ể làm cho hệ thống con dễ sử dụng hơn.
tốithiểu hóa tính "coupling" (nối ghép) giữacáchệ thống con.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 43
13.6 Mẫu Facade
Thí dụ về việcdùngmẫu Facade :
hệ thống con phụcvụ biên dịch có nhiều class phụcvụ các bước
biên dịch rờirạcnhư Scanner, Parser, ProgramNode,
BytecodeStream, ProgramNodeBuilder. Để dịch source code, ta có
thể viết1 ứng dụng gọidịch vụ củatừng class ₫ể duyệt token,
parser, xây dựng cây cú pháp, tạo code ₫ốitượng... Tuy nhiên làm
như trên sẽ rất khó và dễ gây ra lỗi. Cách khắcphụclà₫ịnh nghĩa1
class mớivớigiaotiếphợpnhất tên là Compiler, nó cung cấp 1 hàm
Compile (file), ứng dụng nào cầndịch source code chỉ cầngởi
thông ₫iệpCompile ₫ến ₫ốitượng Compiler.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 44
13.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 : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 45
13.6 Mẫu Facade
Facade
Subsystem class
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 46
13.6 Mẫu Facade
Các phầntử tham gia :
Facade (Compiler)
à biết class nào liên quan ₫ến request xác ₫ịnh.
à nhờ các ₫ốitượng liên quan thựchiện request.
subsystem classe (Scanner, Parser,..)
à hiệnthựcmộtchứcnăng cụ thể củahệ thống con.
à xử lý công việc ₫ược ₫ốitượng Façade nhờ.
à không cầnbiết Facade, không có tham khảo ₫ến Facade.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 47
13.7 Mẫu Flyweight
Mụctiêu:
dùng phương tiện dùng chung ₫ể quảnlýhiệuquả 1 số rấtlớn
₫ốitượng có nhiều thành phầngiống nhau.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 48
13.7 Mẫu Flyweight
Thí dụ về việcdùngmẫu Flyweight :
Chương trình xử lý vănbản dùng khái niệm ₫ốitượng ₫ể miêu tả bất
kỳ phầntử cơ bản nào : ký tự, công thức, hình, .... Ký tự là ₫ốitượng
xuấthiệnrất nhiềulần trong vănbản, nếutamiêutả₫ốitượng ký tự
chứatrựctiếptấtcả các thông tin về nó như mã ký tự, tên font, kích
cỡ, màu, biếnthể (normal, bold, italic,), thì mỗi ₫ốitượng ký tự sẽ
chiếm nhiều không gian, như vậyviệclưugiữ các ₫ốitượng ký tự sẽ
rất không hiệuquả. Mẫu Flyweight rất thích hợp ₫ể giảiquyếtvấn
₫ề miêu tả₫ốitượng ký tự.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 49
13.7 Mẫu Flyweight
Thí dụ về việcdùngmẫu Flyweight :
Flyweight là ₫ốitượng dùng chung dựa vào khái niệmcơ bảnlàcác
thuộctínhcủanócóthể ₫ược chia làm 2 loại:
à trạng thái trong : các thuộc tính ₫ộclậpvớingữ cảnh sử dụng,
thí dụ₫ốitượ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 ₫ổitheongữ
cảnh, thí dụ₫ốitượng ký tự có thuộc tính tên font, kích cỡ, màu,
biếnthể, là trạng thái ngoài. Ta không nên chứatrạng thái
ngoài trựctiếp trong ₫ốitượng mà nên gom chúng trong 1 ₫ối
tượng khác, flyweight chỉ chứathamkhảo ₫ến ₫ốitượng chứa
trạng thái ngoài.
Đốitượng chứatrạng thái ngoài thường ₫ược dùng chung bởinhiều
flyweight khác nhau.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 50
13.7 Mẫu Flyweight
Miêu tả các ₫ốitượ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ểnthị hiểnthị hiểnthị hiểnthị hiểnthị hiểnthị
Miêu tả các ₫ốitượng ký tự dùng mẫu Flyweight giúp dùng chung
các thông số hiểnthị bởirất nhiềukýtự có cùng cách thứchiển
thị.
Code (N) Code (N) Code (N) Code (N) Code (N) Code (N)
Các thông số
hiểnthị
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 51
13.7 Mẫu Flyweight
Miêu tả các ₫ốitượ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ểnthị
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 52
13.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 : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 53
13.7 Mẫu Facade
Các phầntử tham gia :
Flyweight (Glyph) : ₫ịnh nghĩa interface cho ₫ốitượng nhậnyêucầu
và hoạt ₫ộng theo trạng thái ngoài.
ConcreteFlyweight (Character) : hiệnthực interface Flyweight thành
các ₫ốitượng dùng chung.
UnsharedConcreteFlyweight (Character) : hiệnthực interface
Flyweight thành các ₫ốitượng không dùng chung.
FlyweightFactory : tạovàquảnlýcác₫ốitượ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 : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 54
13.8 Kếtchương
Chương này ₫ãgiớithiệu các thông tin cơ bảnvề mẫuthiếtkế
hướng ₫ốitượng và miêu tả mục tiêu, tính chấtcủacácmẫuthiết
kế phụcvụ cấutrúccác₫ốitượng như Adapter, Composite,
Proxy, Decorator, Facade, Flyweight.
Khoa Khoa học& Kỹ thuật Máy tính Môn : Lập trình hướng ₫ối tượng
Trường ĐH Bách Khoa Tp.HCM Chương 13 : Các mẫuthiếtkế phụcvụ tổ chứccấutrúccác₫ốitượng
© 2010 Slide 55File đính kèm:
bai_giang_lap_trinh_huong_doi_tuong_chuong_13_cac_mau_thiet.pdf

