
Khoa Khoa học& Kỹthuật Máy tính
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 1
11.1 Tổng quát vềnhóm mẫu “Behavioral Patterns”
11.2 Mẫu Chain of Responsibility
11.3 Mẫu Template Method
11.4 Mẫu Strategy
11.5 Mẫu State
11.6 Mẫu Command
11.7 Mẫu Observer
11.8 Kếtchương
Chương 11
Các mẫuthiếtkếche dấu hành vi, thuậtgiải
trong ₫ốitượng (Behavioral Patterns)
Khoa Khoa học& Kỹthuật Máy tính
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 2
11.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ư: ohu5 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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 3
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 4
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 5
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 6
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 7
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 8
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 9
11.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
Trường ĐH Bách Khoa Tp.HCM
© 2010
Môn : Nhập môn Công nghệphầnmềm
Chương 11 : Các mẫuthiếtkếche dấu hành vi, thuậtgiải trong ₫ốitượng
Slide 10
11.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ộc tính tham khả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.

