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 55
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_13_cac_mau_thiet.pdf