Khó khăn của thiết kế phần mềm Độ phức tạp Tính bất qui tắc Phần mềm có thể thay đổi và luôn luôn thay y y đổi Phần mềm không nhìn thấy được invisible Phần mềm không nhìn thấy đ
Trang 1Chương 8: Mẫu thiết kế (pattern)
Trang 3Khó khăn của thiết kế phần mềm
Độ phức tạp
Tính bất qui tắc
Phần mềm có thể thay đổi và luôn luôn thay y y đổi
Phần mềm không nhìn thấy được (invisible)
Phần mềm không nhìn thấy được (invisible)
Trang 4Nguyên lý thiết kế lớp
nhưng đóng với việc sửa code
thay thế bằng lớp con kế thừa
vào trừu tương không phụ thuộc vào chi tiết (kiến
vào trừu tương không phụ thuộc vào chi tiết (kiến trúc phân tầng quá nhiều sẽ bất lợi)
Principle): Nên tách giao diện (vd có chức năng
chung) dùng chung thành nhiều đặc thù
Trang 5Mẫu thiết kế (Design Pattern)
giải quyết vấn đề và những mẫu tương ứng để giải
giải quyết vấn đề và những mẫu tương ứng để giải quyết vấn đề
Trang 6 Tên mẫu (Pattern name) - describes the essence of the pattern in a short but expressive name
pattern in a short but expressive name
Mục đích (Intent) - describes the pattern and what it
does
Tên khác (Also-known-as) - lists any synonyms for the pattern
Sự thúc đẩy (Motivation) provides an example of the
Sự thúc đẩy (Motivation) - provides an example of the problem
Khả năng vận dụng (Applicability) g ậ ụ g ( pp y) - notes specific p
design situations in which the pattern is applicable
Trang 7 Cấu trúc (Structure) - describes the classes that are
required to implement the pattern q p p
Lớp tham gia (Participants) - describes the
responsibilities of the classes that are required to implement the pattern
Cộng tác (Collaborations) - describes how the
participants collaborate to carry out their responsibilities
Hệ quả (Consequences) - describes the “design forces”
that affect the pattern and the potential trade-offs that must
be considered when the pattern is implemented (đặt cho
bạn các lựa chọn)
Mẫu liên quan (Related patterns) - cross-references
related design patterns
g p
Trang 8Các mẫu thiết kế
Creational Pattern (Mẫu kiến tạo):
Trang 9Mẫu thiết kế Singleton
Cho phép có một thể hiện của lớp Vd: Find
Di l U ik ột đối tượ t à lư
Dialog, Unikey, một đối tượng toàn cục lưu
giữ kết nối CSDL…
Trang 10Singleton (kiến tạo)
Trang 13 Có 2 mẫu:
ẫ
Trang 16PayProcessor WeeklyEmployee
printPay(WeeklyEmp loyee e)
getName() getPay()
Trang 17PayProcessor printPay(WeeklyEmp
WeeklyEmployee
getName() getPay()
target
Trang 18getName() getMonthlyPay()getEmployeeName()
Adaptee unaltered
Adaptor Contains an adaptee object
Contains an adaptee object Provides own implementation of target’s methods – which call adaptee’s methods
Trang 19//created with adaptee object
public MonthlyAdapter(MonthlyEmployee memp)
{ me = memp; }
//own implementation of target method,
//adapting to use adaptee’s instead
public String getName()
public String getName()
Trang 21Mẫu thiết kế Observer (hành vi)
Bài toán thực tế: Một đối tượng thời gian để
đế iờ đượ thể hiệ dưới hiề hì h thứ
đếm giờ được thể hiện dưới nhiều hình thức như đồng hồ số, đồng hồ kim… Ta có thể
hiện của thời gian đều thay đổi theo
Trang 22đổi trạng thái các đối tượng khác phụ thuộc sẽ được
đổi trạng thái các đối tượng khác phụ thuộc sẽ được biến đổi tự động
tượng có liên quan
Khi có 2 hướng một cái phụ thuộc vào một cái khác
Khi một biến đổi tới một đối tượng đòi hỏi biến đổi những ộ ộ ợ g g đối tượng khác mà không biết bao nhiêu đối tượng cần
biến đổi
Khi ột đối tượ hải ó khả ă thô bá tới đối
Khi một đối tượng phải có khả năng thông báo tới đối
tượng khác mà không cần biết rõ chúng
Trang 23Mô hình Observer
A D
Trang 24subjectState
Trang 25Observer– Sequence Diagram
SetState()
Notify() Update()
GetState()
Update()
GetState()
Trang 27virtual void Attach(Observer *); ( );
virtual void Detach(Observer *);
virtual void Notify();
Trang 28for (i.First(); !i.IsDone(); i.Next()) {
i C tIt () >U d t (thi )
i.CurrentItem()->Update(this);
} }
Trang 29class ClockTimer : public Subject { public:
ClockTimer();
virtual int GetHour();
virtual int GetMinute();
virtual int GetSecond();
void Tick();
}
void ClockTimer :: Tick() { // update internal time-keeping state //…
Notify(); y();
}
Trang 31void DigitalClock :: Draw() {
// get the new values from the subject int hour = _subject->GetHour();
int minute = _subject->GetMinute();
// … //draw the digital clock }
// main
ClockTimer *timer = new ClockTimer;
AnalogClock * analogClock = new AnalogClock(timer);
DigitalClock * digitalClock = new DigitalClcok(timer);
Trang 32Observer C# (tham khao file project)
_observer = new ArrayList();
} public void Attach(Observer o) {
for (int i = 0; i < _observer.Count; i++) {
((Observer)_observer[i]).Update(this);
(( )_ [ ]) p ( );
} } }
Trang 33Mẫu thiết kế Composite (kiến trúc)
Bài toán thực tế: Một máy có các chi tiết
á á hi tiết á ó thể ồ á hi tiết
máy, các chi tiết máy có thể gồm các chi tiết máy đơn giản (chi tiết máy đơn) và có thể có
hư hi tiết á ( hi tiết á hứ ) à
nhưng chi tiết máy (chi tiết máy phức) mà
gồm có những chi tiết máy đơn và các chi
tiết á hứ khá
tiết máy phức khác
giá trị máy bằng giá trị của các chi tiết máy đơn
và giá trị của chi tiết máy phức (bằng tất cả giá trị của các chi tiết)
trị của các chi tiết)
Trang 34 Intent (mục đích): Compose objects into tree structures to
represent part-whole hierarchies Let clients treat individual p pa o a a d dua
objects and compositions of objects uniformly
Motivation (sự thúc đẩy): components can be grouped to form larger components
aPicture
aPicture aLIne aRectangle
aText aLine aRectangle
Trang 35Ví dụ 1
Draw() Add(Graphic) Remove(Graphic) GetChild(int)
GetChild(int)
Trang 36Ví dụ 2
Operation() Add(Component) Remove(Component) GetChild(int)
Leaf
Composite
Operation()
Operation() Add(Component) Remove(Component)
GetChild(int)
Trang 37Cộng tác
Client tương tác với các đối tượng trong cấu trúc kết hợp qua interface lớp kết hợp
Nếu đối tượng nhận là lá thì xử lý trực tiếp ợ g ậ ý ự p
Nếu đối tượng nhận là một nốt kết hợp thì
chuyển yêu cầu tới thành phần con của nó