Bài giảng Lập trình hướng đối tượng - Chương 15: Các mẫu thiết kế che dấu hành vi, thuật giải trong đối tượng (Behavioral Patterns) - Đại học Bách khoa TP.HCM
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 15: Các mẫu thiết kế che dấu hành vi, thuật giải trong đối tượng (Behavioral Patterns) - Đại học Bách khoa TP.HCM", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_15_cac_mau_thiet.pdf
Nội dung text: Bài giảng Lập trình hướng đối tượng - Chương 15: Các mẫu thiết kế che dấu hành vi, thuật giải trong đối tượng (Behavioral Patterns) - Đại học Bách khoa TP.HCM
- Chương 15 Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng (Behavioral Patterns) 15.1 Tổng quát về nhóm mẫu “Behavioral Patterns” 15.2 Mẫu Chain of Responsibility 15.3 Mẫu Template Method 15.4 Mẫu Strategy 15.5 Mẫu State 15.6 Mẫu Command 15.7 Mẫu Observer 15.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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 1 15.1 Tổng quát về nhóm mẫu “Behavioral Patterns” Trong ₫oạn code giải quyếtvấn ₫ề của ứng dụng, khi cầnphải chọnlựa 1 trong nhiềuthuậtgiải/hành vi khác nhau thì ta thường dùng phát biểu if/switch như sau : Switch (acode) { case ALG1 : //₫oạn code miêu tả thuậtgiải/hành vi 1 case ALG2 : //₫oạn code miêu tả thuậtgiải/hành vi 2 case ALGn : //₫oạn code miêu tả thuậtgiải/hành vi n } Đoạn code trên có nhiều khuyết ₫iểmnhư : phu thuộc hoàn toàn vào số lượng thuậtgiải/hành vi, vào chi tiếtcụ thể củatừng thuật giải/hành vi, phảihiệuchỉnh khi số lượng/chi tiếtcủathuật giải/hành vi bị thay ₫ổi. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 2
- 15.1 Tổng quát về nhóm mẫu “Behavioral Patterns” Để khắcphục các nhược ₫iểmcủacáchlậptrìnhcổ₫iển trong slide trước, cách tốtnhất là dùng 1 trong các mẫuthuộcnhóm “Behavioral Patterns”. Nhiệmvụ củacácmẫuthuộc nhóm “” là che dấucác₫oạn code miêu tả thuậtgiải/hành vi vào trong các ₫ốitượng, code của client chỉ giữ tham khảo ₫ến ₫ốitượng và gởi thông ₫iệpnhờ₫ốitượng thựchiệnthuậtgiải/hành vi cụ thể 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 3 15.2 Mẫu Chain of Responsibility Mụctiêu: Mẫu dây chuyền trách nhiệm (Chain of Responsibility) giúp tránh ₫ượcviệcgắnkếtcứng giữaphầntử gởi request (Client) vớiphầntử nhậnvàxử lý request (Server) bằng cách cho phép hơn1 ₫ốitượng có cơ hộixử lý request ₫ó. Các ₫ốitượng nhận và xử lý request sẽ ₫ượcliênkếtlại thành 1 dây chuyền, Client sẽ tham khảo ₫ến ₫ầu dây chuyền này ₫ể gởi request khi có 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 4
- 15.2 Mẫu Chain of Responsibility Thí dụ về việcdùngmẫu Chain of Responsibility : Trong ứng dụng có trợ giúp theo ngữ cảnh thì user có thể xem thông tin trợ giúp của1 phầntử giao diệnnào₫ótrựctiếptừ phầntử ₫óbằng cách ấnphảichuột vào nó. Lưu ý là các ₫ốitượng giao diệnthường ₫ượctổ chức theo dạng cây thứ bậc: 1 chương trình có nhiềucửasổ giao diện, mỗicửasổ giao diệnchứanhiều ₫ốitượng giao diện, mỗi ₫ốitượng giao diệncóthể là group chứa nhiều ₫ối tượng giao diện con Tóm lạisố lượng các ₫ốitượng giao diện ₫ơn (không chứa ₫ốitượng khác nữa) củachương trình thường rấtlớn, chi phí hiệnthựctấtcả sự trợ giúp cho tấtcả các ₫ốitượng ₫ơnnày sẽ rấtlớn, do ₫óthường sẽ ₫ượchiệnthựctừ từ thông qua nhiều version mới ₫ạt ₫ượcsự hoàn chỉnh. Tuy nhiên, dưới góc nhìn user, ngay cả version ₫ầu tiên, chương trình cũng phải ₫áp ứng tốtmọi yêu cầutrợ giúp theo ngữ cảnh trên mọi ₫ốitượng giao diệ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 5 15.2 Mẫu Chain of Responsibility Cách tốtnhất ₫ể giải quyếtvần ₫ề trên là dùng mẫuChain of Responsibility 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 6
- 15.2 Mẫu Chain of Responsibility Lược ₫ồ ₫ốitượng liên quan ₫ến 1 button nào ₫ócódạ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 7 15.2 Mẫu Chain of Responsibility Theo lược ₫ồ ₫ốitượng của Button như trên thì khi user ấnphảichuột vào button ₫ể xem trợ giúp về button ₫óthì: Hoặclàhàmxử lý HandleHelp() của chính button ₫óchạy(nếucó hiệnthực) ₫ể hiểnthị nội dung trợ giúp chính xác về button ₫ó. Hoặclàhàmxử lý HandleHelp() của ₫ốitượng chứa button sẽ chạy (GroupBox - nếucóhiệnthực) ₫ể hiểnthị nội dung trợ giúp về phần tử GroupBox ₫ó, nội dung này thường chứa thông tin trợ giúp của button. Tương tự, nếu GroupBox không hiệnthực hàm xử lý HandleHelp() thì hàm HandleHelp() của Form sẽ chạy, còn nếu Form cũng không hiệnthực hàm xử lý HandleHelp() thì cuối cùng hàm xử lý HandleHelp() củachương trình sẽ chạy. Trong trường hợp này user sẽ xem ₫ượcnội dung trợ giúp của toàn phầnmềm, trong ₫ócó thông tin sử dụng button mà họ 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 8
- 15.2 Mẫu Chain of Responsibility Ta có thể xây dựng mẫu Chain of Responsibility theo loại object pattern 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 9 15.2 Mẫu Chain of Responsibility Các phầntử tham gia : IService (IHelpHandler) : ₫ịnh nghĩa interface củatácvụ xử lý request. AbstractService (Widget) : ₫ặctả các thành phần dùng chung cho tất cả₫ốitượng xử lý request, thí dụ thuộctínhthamkhảo ₫ến ₫ốitượng ₫i sau mình trong dây chuyềnxử lý, hiệnthựctácvụ request() với nhiệmvụ cơ bảnnhấtlàgọitácvụ này của ₫ốitượng mà mình tham khảotrựctiếp. ConcreteService1 (Button ) : hiệnthựctácvụ request() theo yêu cầuriêngcủa mình theo ý tưởng chung như sau : nếucóthể xử lý ₫ược request, nó sẽ xử lý, nếu không thì gởitiếp request cho ₫ối tượng ₫isaugiải quyết. Client : chứa tham khảo ₫ến ₫ốitượng ₫ầu tiên trong dây chuyền ₫ể mỗilầncầnthựchiện request, nó sẽ gởi thông ₫iệptới ₫ốitượng 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 10
- 15.3 Mẫu Template Method Mụctiêu: Định nghĩagiảithuậttổng quát ₫ể giải quyếtvấn ₫ề nào ₫ó trong mộttácvụ, trong giảithuậttổng quát này có gọi1 số tác vụ chứcnăng cơ bản nào ₫ó ₫ể thựchiệncôngviệc theo yêu cầucủagiảithuậttổng quát, tuy nhiên các tác vụ cơ bản ₫ược gọisẽ ₫ượchiệnthực sau trong các class con, chứ class hiện hành cũng chưabiết chúng sẽ làm gì cụ thể. Như chúng ta ₫ã trình bày nhiềulần trong tài liệu này, một trong các mục tiêu chính củaviệcviếtchương trình là phảiviết ₫ược ₫oạn code giảiquyết ₫úng chứcnăng và có tính tổng quát hóa cao ₫ể hạnchế tối ₫aviệchiệuchỉnh lại. Mẫu Template Method là 1 trong những biệnpháphỗ trợ mục tiêu 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 11 15.3 Mẫu Template Method Thí dụ về việcdùngmẫu Template Method : Giả sử ta muốnviếtchương trình quảnlýhệ thống file (FileManagerApp) cho phép user thựcthựchiện1 số tác vụ xử lý hệ thống file như xóa file ₫ệ qui từ 1 thư mụcxác₫ịnh; ₫ếmsố lượng file con, cháu, chắt của 1 thư mục; tìm và diệtvirus tấtcả các file từ thư mụcxác₫ịnh Phân tích các chứcnăng củachương trình xử lý hệ thống file ta phát hiện1 số ý tưởng 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 12
- 15.3 Mẫu Template Method Thí dụ về việcdùngmẫu Template Method : Mỗichứcnăng cần 1 form giao diệnvớiuser, nhưng may mắnlà các form giao diệnphụcvụ các chứcnăng ₫ều khá giống nhau về số lượng và tính chất các phầntử giao diện. Cụ thể mỗi form cần chứacác₫ốitượng giao diệnnhư : Button ₫ể giúp user duyệtchọn thư mụcxuất phát, TextBox ₫ể hiểnthị ₫ường dẫnthư mụcxuất phát, TextBox ₫ể giúp user ₫ặctả pattern về các phầntử cầnxử lý (*, *.exe, ), Button ₫ể user kích hoạtviệcthựchiệnchứcnăng, ListBox ₫ể hiểnthị thông tin về kếtquả 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 13 15.3 Mẫu Template Method Thí dụ về việcdùngmẫu Template Method : Mỗichứcnăng cầnphải duyệt ₫ệ qui hệ thống file, bắt ₫ầutừ thư mụcchỉ₫ịnh bởi user, ₫ể lầnlượtgặptừng file rồithựchiệnhoạt ₫ộng xử lý xác ₫ịnh trên file ₫ó. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 14
- 15.3 Mẫu Template Method Cách tốtnhất ₫ể xây dựng chương trình trên là dùng mẫu Template Method 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 15 15.3 Mẫu Template Method Class FileCommandDlg ₫ặctả form giao diệntổng quát cho mọichức năng, nó có 4 tác vụ miêu tả các giảithuậttổng quát ₫ược dùng chung cho mọi class con, ta gọicáctácvụ này là “template method” : FileCommandDlg() chứagiảithuậttạoform, tạocác₫ốitượng con trong form và thêm chúng vào form ở vị trí và kích thướcmong muốn. Lệnh cuốicùngcủagiảithuậttạoform tổng quát này sẽ gọi hàm initForm() ₫ể hiệuchỉnh nội dung chuỗivănbản ₫ượchiểnthị kèm theo từng phầntử giao diện sao cho phù hợpvớichứcnăng ₫ặc thù. Lưu ý là trong các môi trường lậptrìnhtrựcquannhư Visual Studio .Net, ngườilậptrìnhsẽ dùng tiện ích thiếtkế trực quan form giao diệnchodễ dàng, nhanh chóng, chính xác. Máy sẽ tự₫ộng sinh mã cho tác vụ tạo form theo ₫úng yêu cầuthiếtkế củauser. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 16
- 15.3 Mẫu Template Method btnBrowse_Click() là hàm xử lý sự kiện Click chuột trên button Browse của user, nó có nhiệmvụ chung là hiểnthị cửasổ duyệt chọnthư mụcxuất phát. btnStart_Click() là hàm xử lý sự kiện Click chuột trên button Start của user, nó có nhiệmvụ chung là thựchiệnchứcnăng trên thư mụcxuất phát. Giảithuậtcủatácvụ này gồm3 bước công việc: prolog() → browseTree() → epilog(). browseTree() chứagiảithuật duyệttừng file 1 cách ₫ệ qui, xuất phát từ thư mụcxuất phát do user chỉ₫ịnh, mỗilầngặp 1 file thì sẽ gọitácvụ action() thựchiện hành vi nào ₫ó lên file. Các tác vụ initForm(), prolog(), action(), epilog() ₫ược dùng trong giảithuậtcủatácvụ template method nhưng sẽ ₫ượctừng class con ₫ặctả cụ thể theo yêu cầuchứcnăng ₫ặcthùcủa class con ₫ó. Ta gọicáctácvụ này là “primitive function”. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 17 15.3 Mẫu Template Method Ta có thể xây dựng mẫu Template Method theo loại class pattern với lượ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 18
- 15.3 Mẫu Template Method Các phầntử tham gia : ITemplate (Form) : ₫ịnh nghĩa interface thống nhấtcủa các class chứcnăng cần dùng, interface này thường chứanhiềutácvụ chức năng có tính chất chung như sau : ₫ể thựchiệnchứcnăng ta sẽ dùng giảithuậttổng quát. Như vậycáctácvụ chứcnăng trong interface thường là các “template method”. AbstractClass (FileCommandDlg) : ₫ặctả class cha dùng chung, class này chứacáctácvụ “template method”, mỗitácvụ “template method” miêu tả giảithuậttổng quát ₫ể thựchiệnchứcnăng tương ứng, trong giảithuậttổng quát có gọi các hàm “primitive function”. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 19 15.3 Mẫu Template Method Các phầntử tham gia (tt) : ConcreteClass1 (RecursiveFilesDelDlg ) : các class con, mỗi class chịu trách nhiệm override các hàm “primitive function” theo yêu cầuxử lý ₫ặcthùcủa mình. Các class con này không cầnvà không ₫ược phép override các tác vụ “template method” ₫ã ₫ược ₫ặctả 1 lần ở class cha. Client (FileManagerApp) : miêu tả₫oạn code của client sử dụng các chứcnăng 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 20
- 15.4 Mẫu Strategy Mụctiêu: Cung cấpmộthọ giảithuật khác nhau ₫ể giải quyết cùng 1 vấn ₫ề nào ₫ó và cho phép Client chọnlựalinh₫ộng dễ dàng mộtgiải thuậtcụ thể theo từng tình huống sử dụng. Về nguyên lý chung, thường có nhiềugiảithuật khác nhau cùng giảiquyết ₫ược 1 bài toán. Mỗigiảithuậtcónhững ưu khuyết ₫iểm riêngvàsẽ thích hợphơn trong ngữ cảnh sử dụng nào ₫óso với các giảithuậtcònlại. Cách tốtnhất ₫ể giúp Client chọnlựalinh ₫ộng và dễ dàng 1 giảithuật phù hợp theo từng tình huống là dùng mẫuStrategy. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 21 15.4 Mẫu Strategy Thí dụ về việcdùngmẫu Strategy : Thí dụ₫ểsắpxếpthứ tự các phầntử trong 1 danh sách, ta có nhiềugiảithuậtsắpxếp khác nhau như sắptuầntự, bubblesort, nhị phân, Cách tốtnhất ₫ể thiếtlậplinh₫ộng giảithuậtsắpxếp cho danh sách và giúp code củacáctácvụ chứcnăng trong ₫ối tượng danh sách hoàn toàn ₫ộclậpvớigiảithuậtsắpxếpthứ tự là dùng mẫu Strategy vớilược ₫ồ class như sau : Đốitượng danh sách có 1 tham khảo ₫ến ₫ốitượng thựchiệnsắp xếpthứ tự các phầntử, tùy yêu cầucụ thể, ta tạo ₫ốitượng chứa giảithuậtsắpxếp mong muốn và gán tham khảo ₫ến ₫ốitượng này vào thuộc tính tham khảocủa ₫ốitượng danh sách. Mỗilần cầnsắpxếpthứ tự các phầntử trong danh sách của mình, nó gởi thông ₫iệp sStart.sort(this) ₫ể kích hoạttácvụ sắpxếpthứ tự chứ nó không biết chính xác giảithuậtsắpxếpnàosẽ chạ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 22
- 15.4 Mẫu Strategy 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 23 15.4 Mẫu Strategy Ta có thể xây dựng mẫu Strategy theo loại object pattern 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 24
- 15.4 Mẫu Strategy Các phầntử tham gia : IStrategy (ISortStrategy) : ₫ịnh nghĩa interface cho tấtcả các class thể hiệngiảithuậtthựchiện1 chứcnăng xác ₫ịnh nào ₫ó. Strategy1 (BinarySort ) : class miêu tả giảithuậtcụ thể₫ểgiải quyếtchứcnăng. Nó thường nhận tham khảo ₫ến Client (₫ối tượng Subject) trong lúc ₫ượckhởitạo ₫ể thông qua tham khảo này, nó truy xuấtdữ liệucủa Client hầuphụcvụ giảithuậtchức năng của mình. Subject (List ) : class ₫ặctả Client có sử dụng giảithuậtdo các class Strategy hiệnthự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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 25 15.5 Mẫu State Mụctiêu: Về nguyên lý chung, hành vi của ₫ốitượng có thể phụ thuộcvào trạng thái hiện hành của ₫ốitượng ₫ó. Cách tốtnhất ₫ể giúp ₫ối tượng thay ₫ổilinh₫ộng và dễ dàng 1 hành vi phù hợptheotừng trạng thái là dùng mẫu State. Cho phép 1 ₫ốitượng thay ₫ổi hành vi khi trạng thái bên trong của nó thay ₫ổi. Ta có cảmgiácnhư class của ₫ốitượng bị thay ₫ổi. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 26
- 15.5 Mẫu State Thí dụ về việcdùngmẫu State : Thí dụ trong class TCPConnection miêu tả 1 mốinốimạng, ₫ối tượng TCPConnection có thểở1 trong nhiềutrạng thái : Established, Listening, Closed. Khi ₫ốitượng TCPConnection nhận request nào ₫ó, nó sẽ₫áp ứng khác nhau tùy vào trạng thái hiện hành. Cách tốtnhất ₫ể giảiquyếtyêucầu trên là dùng mẫu State theo lược ₫ồ class sau ₫â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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 27 15.5 Mẫu State state TCPConnection ITCPState Open() Open() Close() Close() Acknowledge() Acknowledge() state->Open(); TCPEstablished TCPListen TCPClosed Open() Open() Open() Close() Close() Close() Acknowledge() Acknowledge() Acknowledge() 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 28
- 15.5 Mẫu State Ta có thể xây dựng mẫu State theo loại object pattern vớilược ₫ồ class như sau : state Context IState Request() Handle() state->Handle(); ConcreteStateA ConcreteStateB ConcreteStateC Handle() Handle() Handle() 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 29 15.5 Mẫu State Các phầntử tham gia : Context (TCPConnection) : ₫ịnh nghĩa interface cầndùngcho client. Duy trì 1 tham khảo ₫ến ₫ốitượng của 1 class con ConcreteState mà ₫ịnh nghĩatrạng thái hiện hành. IState (ITCPState) : ₫ịnh nghĩa interface nhằm bao ₫óng hành vi kếthợpvớitrạng thái cụ thể. Duy trì 1 tham khảo ₫ến ₫ốitượng của 1 class con ConcreteState mà ₫ịnh nghĩatrạng thái hiện hành. ConcreteState (TCPEstablished, TCPListen, TCPClose) : ₫ịnh nghĩavàchedấuhànhvi cụ thể kếthợpvớitrạng thái của mì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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 30
- 15.6 Mẫu Command Mụctiêu: Đóng gói ₫oạn code phụcvụ 1 yêu cầuxác₫ịnh của Client trong một ₫ốitượng, nhờ₫ócóthể thông số hóa ₫oạn code nhậnvàthực hiện các thao tác trên request như sắpxếp, ghi logfile, undo, 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 31 15.6 Mẫu Command Thí dụ về việcdùngmẫu Command : Chươngtrìnhcógiaodiện ₫ồ họatrực quan thường dùng nhiều cửasổ giao diện, mỗicửasổ thường có 1 thanh menubar chứa nhiều menu dạng pop-up, mỗi menu pop-up chứa nhiềumụcchức năng, mỗimụcchứcnăng có thể là 1 menu pop-up con Cuối cùng mỗimụcchứcnăng cơ bản ₫ược dùng ₫ể kích hoạtchức năng tương ứng. Yêu cầuphổ biếnvề thanh menubar củacửasổ chứcnăng là nó có thể ₫ượchiệuchỉnh ₫ộng theo thờigian (thêm/bớt/thay ₫ổitừng thành phần trong thanh menu), hoặcthậm chí muốn thay ₫ổihànhvi ₫áp ứng vớitừng mụcchứcnăng hiện có trong thanh menubar. Cách tốtnhất ₫ể giảiquyếtvấn ₫ề này là dùng mẫu Command 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 32
- 15.6 Mẫu Command 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 33 15.6 Mẫu Command Mỗi ₫oạn code thựchiệnchứcnăng nào ₫ósẽ ₫ược ₫ặt trong tác vụ execute() của 1 class tương ứng, các class này ₫ềuhỗ trợ cùng interface thống nhất ICommand. Mỗi ₫ốitượng giao diện (Button, mụcchứcnăng của menu pop- up, ) chứa 1 tham khảo ₫ến ₫ốitượng ICommand, hàm xử lý sự kiện Click chuộttrênnóluôn₫ượcviếtnhư sau : cmd.execute(); Lệnh này sẽ kích hoạttácvụ execute() của ₫ốitượng ₫ược tham khảohiện hành chạy, còn ₫ốitượng ₫ược tham khảolàailàtùy theo hành vi cụ thể nào cầnthựchiệ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 34
- 15.6 Mẫu Command Ta có thể xây dựng mẫu Command theo loại object pattern 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 35 15.6 Mẫu Command Các phầntử tham gia : ICommand : interface thống nhấtchomọi ₫ốitượng xử lý request, nó chứaítnhất1 tácvụ execute() ₫ể thựchiện hành vi ₫ượcyêucầutừ client. Command1 (PasteCommand, OpenCommand ) : class ₫ặctả giảithuậtthựchiện hành vi cụ thể, nó thường có thuộctínhtham khảo ₫ến ₫ốitượng Receiver chứadữ liệuvàtácvụ chứcnăng có liên quan. Invoker (MenuItem): ₫ốitượng gửi request ₫ến ₫ốitượng ICommand ₫ể nhờ thựchiện hành vi tương ứng. Client (Application) : module khởitạo ₫ốitượng Command cụ thể và gởi cho nó tham khảo ₫ến ₫ốitượng Receiver. Receiver (Document, Application) : chứadữ liệuvàtácvụ chứcnăng có liên quan ₫ếnhànhvi mà₫ốitượng Command cầnthựchiệ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 36
- 15.7 Mẫu Observer Mụctiêu: Định nghĩasự phụ thuộc1-n giữacác₫ốitượng sao cho khi 1 ₫ối tượng trung tâm bị thay ₫ổinội dung (trạng thái) thì n ₫ốitượng phụ thuộcnó₫ượccảnh báo hầuhiệuchỉnh tự₫ộng theo ₫ồitượng trung tâm, nhờ₫ó ₫ảmbảo ₫ược tính nhất quán giữachúng. Thường ₫ốitượng trung tâm là ₫ốitượng chứadữ liệu bên trong ứng dụng, còn n ₫ốitượng phụ thuộcnólànhững ₫ốitượng giao diệncủa ứng dụng. Nội dung củacác₫ốitượng giao diện ₫ược chứavàquảnlýbởi ₫ốitượng bên trong ứng dụ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 37 15.7 Mẫu Observer Thí dụ về việcdùngmẫu Observer : Trong ứng dụng quảnlýbảng tính (MSExcel), mỗibảng tính là 1 bảng dữ liệucủa 1 database tương ứng (ta gọi là workbook hay file *.xls). Ta có thể hiểnthị nội dung củabảng dữ liệutrênnhiều ₫ối tượng giao diện khác nhau, thí dụ như spreadsheet (bảng nội dung chi tiết 2 chiều), barchart (biểu ₫ồ vạch), piechart (biểu ₫ồ bánh), Mỗikhibảng dữ liệu bên trong phầnmềm thay ₫ổinội dung bởiai ₫ó(cóthể do phầnmềm khác), nó phảigởicảnh báo (notify) ₫ến mọi ₫ốitượng giao diện có dùng nội dung củanó₫ể các ₫ốitượng này kịpthờihiểnthị lạinội dung mới. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 38
- 15.7 Mẫu Observer Thí dụ về việcdùngmẫu Observer : Tương tự, nếu ₫ốitượng giao diện nào cho phép ngườidùngcập nhậtnội dung (spreadsheet), thì mỗi khi user cậpnhậtnội dung, nó không ₫ượccậpnhậtcụcbộ mà phảigởiyêucầucậpnhậtnội dung về₫ốitượng trung tâm, chỉ có ₫ốitượng này mới có quyền quyết ₫ịnh cậpnhật hay không, nếunócậpnhậtnội dung thì nội dung sẽ bị thay ₫ổivànhư thế nó phảigởicảnh báo cho mọi ₫ối tượng phụ thuộcnóbiết. Cách tốtnhất ₫ể giảiquyếtvấn ₫ế trên là dùng mẫuthiếtkế Observer 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 39 15.7 Mẫu Observer 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 40
- 15.7 Mẫu Observer Ta có thể xây dựng mẫu Observer theo loại object pattern với lượ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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 41 15.7 Mẫu Observer Các phầntử tham gia : IObservable : interface của ₫ốitượng trung tâm (₫óng vai trò 1 trong mối quan hệ 1-n), nó chứacáctácvụ attach, detach từng ₫ốitượng phụ thuộc nó vào danh sách quảnlý; tácvụ notify() gởicảnh báo cho từng ₫ốitượng phụ thuộc khi có sự thay ₫ổinội dung; tác vụ updateData() nhậnyêucầu thay ₫ổinội dung và xử lý yêu cầu. Observable (WorksheetData) : class ₫ặctả₫ốitượng trung tâm, nó hiệnthực interface IObservable. IObserver : interface thống nhấtcủacác₫ốitượng phụ thuộcvào ₫ốitượng trung tâm. Observer1 (PieChart ) : class ₫ặctả₫ốitượng phụ thuộccụ thể. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 42
- 15.8 Kếtchương Chương này ₫ãgiớithiệu các thông tin cơ bảnvề nhóm mẫu phụcvụ che dấu hành vi, thuậtgiải trong ₫ốitượng (Behavioral Patterns) và thông tin chi tiếtcụ thể về các mẫuChain of Responsibility, Template Method, Strategy, State, Command, Observer. 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 15 : Các mẫuthiếtkế che dấu hành vi, thuậtgiải trong ₫ốitượng © 2010 Slide 43