Chƣơng II CÁC MẪU THIẾT KẾ KIẾN TRÚC PHẦN MỀM TRONG JAVA
2.3 Mẫu hành vi
Cỏc mẫu hành vi là cỏc mẫu tập trung vào vấn đề giải quyết cỏc thuật toỏn và sự phõn chia trỏch nhiệm giữa cỏc đối tượng. Mẫu hành vi khụng chỉ miờu tả mụ hỡnh của cỏc đối tượng mà cũn miờu tả mụ hỡnh trao đổi thụng tin giữa chỳng; đặc trưng hoỏ cỏc luồng điều khiển phức tạp, giỳp chỳng ta tập trung hơn vào việc xõy dựng cỏch thức liờn kết giữa cỏc đối tượng thay vỡ cỏc luồng điều khiển.
Mẫu hành vi kiểu lớp sử dụng tớnh kế thừa để phõn phối hành vi giữa cỏc lớp. Dưới đõy chỳng ta sẽ nghiờn cứu hai mẫu thuộc loại đú: Temple Method và Interpreter. Trong hai mẫu đú, Temple Method là mẫu đơn giản và thụng dụng hơn. Nú định nghĩa trừu tượng từng bước của một thuật toỏn; mỗi bước sử dụng một hàm trừu tượng hoặc một hàm nguyờn thuỷ. Cỏc lớp con của nú làm sỏng tỏ thuật toỏn cụ thể bằng cỏch cụ thể hoỏ cỏc hàm trừu tượng. Mẫu Interpreter diễn tả văn phạm như một hệ thống phõn cấp của cỏc lớp và trỡnh phiờn dịch như một thủ tục tỏc động lờn cỏc thể hiện của cỏc lớp đú.
Mẫu hành vi kiểu đối tượng lại sử dụng đối tượng thành phần thay vỡ thừa kế. Một vài mẫu miờu tả cỏch thức một nhúm cỏc đối tượng ngang hàng hợp tỏc với
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
nhau để thi hành cỏc tỏc vụ mà khụng một đối tượng riờng lẻ nào cú thể tự thi hành. Một vấn đề quan trọng được đặt ra ở đõy là bằng cỏch nào cỏc đối tượng ngang hàng đú biết được sự tồn tại của nhau. Cỏch đơn giản nhất và cũng “dư thừa” nhất là lưu trữ cỏc tham chiếu trực tiếp đến nhau trong cỏc đối tượng ngang hàng. Mẫu Mediator trỏnh sự thừa thói này bằng cỏch xõy dựng kết nối trung gian, liờn kết giỏn tiếp cỏc đối tượng ngang hàng.
Mẫu Chain of Responsibility xõy dựng mụ hỡnh liờn kết thậm chớ cũn “lỏng” hơn. Nú cho phộp gửi yờu cầu đến một đối tượng thụng qua chuỗi cỏc đối tượng “ứng cử”. Mỗi ứng cử viờn cú khả năng thực hiện yờu cầu tuỳ thuộc vào cỏc điều kiện trong thời gian chạy. Số lượng ứng cử viờn là một con số mở và ta cú thể lựa chọn những ứng cử viờn nào sẽ tham gia vào chuỗi trong thời gian chạy.
Mẫu Observer xõy dựng và vận hành một sự phụ thuộc giữa cỏc đối tượng. Một vớ dụ cụ thể của mẫu này là mụ hỡnh Model/View/Controller của Smalltalk trong đú tất cả cỏc views của model đều đựơc thụng bỏo khi trạng thỏi của model cú sự thay đổi. Một số mẫu hành vi khỏc lại quan tõm đến việc đúng gúi cỏc hành vi vào một đối tượng và “uỷ thỏc” cỏc yờu cầu cho nú. Mẫu Strategy đúng gúi một thuật toỏn trong một đối tượng, xõy dựng cơ chế khiến cho việc xỏc định và thay đổi thuật toỏn mà đối tượng sử dụng trở nờn đơn giản. Trong khi đú mẫu Command lại đúng gúi một yờu cầu vào một đối tượng; làm cho nú cú thể được truyền như một tham số, được lưu trữ trong một History list hoặc thao tỏc theo những cỏch thức khỏc. Mẫu State đúng gúi cỏc trạng thỏi của một đối tượng, làm cho đối tượng cú khả năng thay đổi hành vi của mỡnh khi trạng thỏi thay đổi. Mẫu Visitor đúng gúi cỏc hành vi vốn được phõn phối trong nhiều lớp và mẫu Iterator trừu tượng hoỏ cỏch thức truy cập và duyệt cỏc đối tượng trong một tập hợp.
2.3.1 Mẫu Chain of Responsibility
- Vấn đề đặt ra
Xột bài toỏn xõy dựng hệ thống trợ giỳp phụ thuộc ngữ cảnh cho một giao diện đồ hoạ; trong đú người sử dụng cú thể lấy thụng tin trợ giỳp về bất cứ thành phần nào của giao diện bằng cỏch ấn vào nú. Thụng tin trợ giỳp cung cấp phụ thuộc
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
vào thành phần giao diện đựơc chọn và ngữ cảnh của nú. Lấy vớ dụ một nỳt trong một hộp thoại sẽ cú thụng tin trợ giỳp khỏc với một nỳt tương tự trong cửa sổ chớnh. Ngoài ra nếu khụng cú thụng tin trợ giỳp nào được cung cấp cho thành phần đựơc chọn của giao diện, hệ thống trợ giỳp sẽ hiển thị thụng tin trợ giỳp tổng quỏt hơn về ngữ cảnh, lấy vớ dụ thụng tin về hộp thoại.
Bài toỏn trờn dẫn đến một hành động rất tự nhiờn đú là tổ chức cỏc thụng tin trợ giỳp theo mức độ tổng quỏt của chỳng, từ cụ thể nhất đến tổng quỏt nhất. Ngoài ra chỳng ta cũng dễ dàng nhận thấy rằng yờu cầu trợ giỳp sẽ được xử lý bởi một trong số cỏc đối tượng giao diện người dựng phụ thuộc vào ngữ cảnh sử dụng và tớnh chi tiết của thụng tin trợ giỳp đươc cung cấp.
Vấn đề đặt ra ở đõy là đối tượng khởi xướng yờu cầu khụng hề biết yờu cầu đú sẽ được xử lý bởi đối tượng cụ thể nào. Vỡ thế chỳng ta cần cú cơ chế tỏch rời chỳng, và mẫu Chain of Responsibility xõy dựng mụ hỡnh để thực hiện điều này:
Theo mụ hỡnh này, đối tượng đầu tiờn trong dõy chuyền sẽ nhận được yờu cầu cú thể xử lý yờu cầu đú hoặc chuyển nú cho đối tượng kế tiếp; điều tương tự cũng xảy ra với đối tượng này. Bằng cỏch này, đối tượng khởi xướng yờu cầu khụng cần biết yờu cầu sẽ được xử lý bởi đối tượng nào, nú chỉ biết rằng yờu cầu đú sẽ đựơc xử lý một cỏch “hợp lý” nhất.
Giả sử người sử dụng yờu cầu trợ giỳp cho một nỳt cú tiờu đề “Print”. Nỳt đú được đặt trong hộp thoại PrintDialog. Đến lượt mỡnh, hộp thoại đú lại cú khả năng xỏc định lớp Application chứa nú. Sơ đồ tương tỏc sau sẽ cho thấy cỏch thức yờu cầu trợ giỳp đú được truyền đi dọc theo dõy chuyền:
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
Trong trường hợp này, cả hai đối tượng aPrintButton và aPrintDialog đều khụng xử lý yờu cầu trợ giỳp; vỡ thế yờu cầu này được chuyển tới cho aApplication để xử lý hoặc bỏ qua khụng làm gỡ.
Để cú khả năng chuyền yờu cầu dọc theo dõy chuyền và để đảm bảo tớnh “ẩn” của cỏc đối tượng cú thể nhận yờu cầu (với đối tượng khởi xướng yờu cầu), mỗi đối tượng trờn dõy chuyền đều cú chung một giao diện trong việc xử lý yờu cầu và chuyển yờu cầu cho đối tượng kế tiếp. Lấy vớ dụ, hệ thống trợ giỳp cú thể định nghĩa lớp HelpHandler với phương thức HandleHelp tương ứng. Lớp HelpHandler cú thể được lấy làm lớp cha của cỏc lớp mà ta muốn cung cấp khả năng xử lý yờu cầu trợ giỳp:
Cỏc lớp Button, Dialog và Application sử dụng cỏc phương thức HandleHelp để xử lý yờu cầu trợ giỳp trong khi phương thức này mặc định chỉ chuyển tiếp yờu cầu trợ giỳp cho nỳt kế tiếp. Khi đú cỏc lớp con cú thể định nghĩa lại phương thức này để cung cấp thụng tin trợ giỳp cụ thể hoặc chỉ sự dụng phương thức mặc định để chuyển tiếp yờu cầu theo dõy chuyền.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn - Định nghĩa mẫu
Mẫu Chain of Responsiblity dựng để trỏnh sự liờn kết trực tiếp giữa đối tượng gửi yờu cầu và đối tượng nhận yờu cầu khi yờu cầu cú thể đựơc xử lý bởi hơn một đối tượng. Múc nối cỏc đối tượng nhận yờu cầu thành một chuỗi và gửi yờu cầu theo chuỗi đú cho đến khi cú một đối tượng xử lý nú.
- Sơ đồ UML
Handler (Approver)
- Định nghĩa một giao diện cho việc nắm giữ cỏc yờu cầu. - Cài đặt liờn kết tới cỏc Successor
ConcreteHandler (Director, VicePresident, President)
- Nắm giữ cỏc yờu cầu mà nú đỏp ứng - Cú thể truy nhập nú
- Nếu ConcreteHandle cú thể nắm giữ cỏc yờu cầu, nú sẽ làm như vậy, bằng khụng nú sẽ gửi cỏc yờu cầu tới cỏc succcesor
Client (ChainApp)
- Khởi tạo yờu cầu tới đối tượng ConcreteHandler trờn chuối đỏp ứng
2.3.2 Command
- Vấn đề đặt ra
Đụi khi chỳng ta gặp tỡnh huống trong đú cần phải gửi yờu cầu đến một đối tượng mà khụng biết cụ thể về đối tượng nhận yờu cầu cũng như phương thức xử lý yờu cầu. Lấy vớ dụ về bộ cụng cụ giao diện người sử dụng cho phộp xõy dựng cỏc Menu. Rừ ràng, nú khụng thể xử lý trực tiếp yờu cầu trờn cỏc đối tượng menu vỡ cỏch thức xử lý phụ thuộc vào từng ứng dụng cụ thể.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
Mẫu Command cho phộp bộ cụng cụ như trờn gửi yờu cầu đến cỏc đối tượng chưa xỏc định bằng cỏch biến chớnh yờu cầu thành một đối tượng. Khỏi niệm quan trọng nhất của mẫu này là lớp trừu tượng Command cú chức năng định nghĩa giao diện cho việc thi hành cỏc yờu cầu. Trong trường hợp đơn giản nhất, ta chỉ cần định nghĩa một thủ tục ảo Execute trờn giao diện đú. Cỏc lớp con cụ thể của Command sẽ xỏc định cặp đối tượng nhận yờu cầu cỏc thao tỏc bằng cỏch lưu trữ một tham chiếu đến đối tượng nhận yờu cầu và định nghĩa lại thủ tục Execute để gọi cỏc thủ tục xử lý.
- Định nghĩa mẫu
Mẫu Command đúng gúi yờu cầu như là một đối tượng, làm cho nú cú thể được truyền như một tham số, được lưu trữ trong một History List hoặc thao tỏc theo những cỏch thức khỏc nhau.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn Command (Command)
- Khai bỏo một giao diện cho việc thực thi một thao tỏc
ConcreteCommand (CalculatorCommand)
- Định nghĩa một liờn kết giữa một đối tượng Receiver và một hành động - Cài đặt Execute bằng cỏch gọi một thao tỏc tương ứng trờn Receiver
Client (CommandApp)
- Tạo ra một đối tượng ConcreteCommand và thiết lập đối tượng nhận của nú
Invoker (User)
- Đề nghị command để thực hiệu yờu cầu
Receiver (Calculator)
- Biết cỏch để thực hiện cỏc thao tỏc kết hợp việc thực hiện cỏc yờu cầu
2.3.3 Interperter
- Vấn đề đặt ra
Nếu một dạng bài toỏn cú tần suất xuất hiện tương đối lớn, người ta thường biểu diễn cỏc thể hiện cụ thể của nú bằng cỏc cõu trong một ngụn ngữ đơn giản. Sau đú ta cú thể xõy dựng một trỡnh biờn dịch để giải quyết bài toỏn bằng cỏch biờn dịch cỏc cõu.
- Định nghĩa
Interpreter đưa ra một ngụn ngữ, xõy dựng cỏch diễn đạt ngụn ngữ đú cựng với một trỡnh phiờn dịch sử dụng cỏch diễn tả trờn để phiờn dịch cỏc cõu.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn AbstractExpression (Expression)
- Khai bỏo một giao diện cho việc thực hiện một thao tỏc
TerminalExpression (ThousandExpression, HundredExpression, TenExpression, OneExpression)
- Cài đặt một thao tỏc thụng dịch liờn kết với những ký phỏp đầu cuối - Một thể nghiệm được yờu cầu cho mọi ký phỏp đầu cuối trong cõu
NonterminalExpression (not used)
- Một lớp như vậy được yờu cầu cho cỏc luật R::=R1R2..Rn trong dóy cỳ phỏp - Duy trỡ một biến thể nghiệm của kiểu AbstractExpression cho mỗi một ký phỏp R1 đến Rn
- Cài đặt một phương thức thụng dịch cho cỏc ký phỏp khụng phải đầu cuối. - Thụng dịch tự gọi đệ quy cho cỏc biến đại diện từ R1 đến Rn
Context (Context)
- Chứa thụng tin toàn cục cho việc thụng dịch
Client (InterpreterApp)
Tạo một cõy cỳ phỏp trừu tượng đại diện cho một cõu đặc thự trong ngữ phỏp đó được định nghĩa. Cõy cỳ phỏp trừu tượng này xuất phỏt từ thể nghiệm của cỏc lớp NonterminalExpression và TerminalExpression yờu cầu một thao tỏc thụng dịch.
2.3.4 Iterator
- Vấn đề đặt ra
Một đối tượng tập hợp như là một danh sỏch cũng cung cấp cho ta cỏc phương thức truy cập cỏc thành phần của nú. Tuy nhiờn đụi lỳc chỳng ta cần duyệt cỏc thành phần của danh sỏch theo những cỏch thức và tiờu chớ khỏc nhau. Chỳng ta khụng nờn làm phồng giao diện của danh sỏch List với cỏc phương thức cho cỏc cỏch thức duyệt.
Mẫu Iterator cho phộp chỳng ta duyệt danh sỏch dễ dàng bằng cỏch tỏch rời chức năng truy cập và duyệt ra khỏi danh sỏch và đặt vào đối tượng iterator. Lớp Iterator sẽ định nghĩa một giao diện để truy cập cỏc thành phần của danh sỏch, đồng thời quản lý cỏch thức duyệt danh sỏch hiện thời.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
- Định nghĩa
Mẫu Iterator cung cấp khả năng truy cập và duyệt cỏc thành phần của một tập hợp khụng cần quan tõm đến cỏch thức biểu diễn bờn trong.
- Sơ đồ UML
Iterator (AbstractIterator)
- Định nghĩa một giao diện cho việc truy cập và duyệt cỏc phần tử
ConcreteIterator (Iterator)
- Cài đặt giao diện Iterator
- Giữ dấu vết của vị trớ hiện tại trong tập duyệt
Aggregate (AbstractCollection)
- Định nghĩa một giao diện để tạo một đối tượng Iterator ConcreteAggregate (Collection)
- Cài đặt giao diện tạo Iterator để trả về một thể nghiệm đỳng của ConcreteIterator.
2.3.5 Mediator
- Vấn đề đặt ra
Cỏch thiết kế hướng đối tượng khuyến khớch việc phõn bố cỏc ứng xử giữa cỏc đối tượng. Việc phõn chia đú cú thể dẫn đến cấu trỳc trong đú tồn tại rất nhiều liờn kết giữa cỏc đối tượng mà trong trường hợp xấu nhất là tất cả cỏc đối tượng đều liờn kết trực tiếp với nhau.
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
- Định nghĩa
Mediator dựng để đúng gúi cỏch thức tương tỏc của một tập hợp cỏc đối tượng. Giảm bớt liờn kết và cho phộp thay đổi cỏch thức tương tỏc giữa cỏc đối tượng.
- Biểu đồ UML
Mediator (IChatroom)
- Định nghĩa một giao diện cho việc giao tiếp với đối tượng cộng tỏc.
ConcreteMediator (Chatroom)
- Xõy dựng cỏc hành vi tương tỏc giữa cỏc đối tượng colleague - Xỏc định cỏc đối tượng colleague
Colleague classes (Participant)
- Mỗi lớp Colleague đều xỏc định đối tượng Mediator tương ứng
- Mỗi đối tượng colleague trao đổi với đối tượng mediator khi muốn trao đổi với colleague khỏc.
2.3.6 Memento
- Vấn đề đặt ra
Đụi lỳc, việc lưu lại trạng thỏi của một đối tượng là cần thiết. Vớ dụ khi xõy dựng cơ chế Checkpoints và Undo để phục hồi hệ thống khỏi trạng thỏi lỗi. Tuy nhiờn cỏc đối tượng thường phải che dấu một vài hoặc tất cả cỏc thụng tin trạng thỏi của mỡnh, làm cho chỳng khụng thể được truy cập từ ngoài.
Chỳng ta cú thể giải quyết vấn đề này với mẫu Memento. Memento là đối tượng cú chức năng lưu lại trạng thỏi nội tại của một đối tượng khỏc gọi là
Colleague Mediator ConcreteColleague1 ConcreteMediator ConcreteColleague2 mediator
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn
Memento's originator. Cơ chế Undo sẽ yờu cầu một Memento từ Originator khi nú cần khụi phục lại trạng thỏi của Originator. Cũng chỉ Originator mới cú quyền truy xuất và lưu trữ thụng tin vào Memento vỡ nú trong suốt đối với cỏc đối tượng cũn lại.
- Định nghĩa
Memento là mẫu thiết kế cú thể lưu lại trạng thỏi của một đối tượng để khụi phục lại sau này mà khụng vi phạm nguyờn tắc đúng gúi.
- Sơ đồ UML
Memento
- Lưu trữ trạng thỏi của đối tượng Originator.
- Bảo vệ, chống truy cập từ cỏc đối tượng khỏc Originator.
Originator
- Tạo Memento chứa hỡnh chụp trạng thỏi của mỡnh - Sử dụng Memento để khụi phục về trạng thỏi cũ.
Caretaker
- Cú trỏch nhiệm quản lý cỏc Memento.
- Khụng thay đổi hoặc truy xuất nội dung của Memento.
2.3.7 Observer
- Định nghĩa
Observer định nghĩa một phụ thuộc 1 - nhiều giữa cỏc đối tượng để khi một
đối tượng thay đổi trạng thỏi thỡ tất cả cỏc phục thuộc của nú được nhận biết và cập nhật tự động
Số húa bởi Trung tõm Học liệu - Đại học Thỏi Nguyờn http://www.lrc-tnu.edu.vn