TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
OBSERVER PATTERN
Môn: Thiết kế phần mềm hướng đối tượng
GVHD: Nguyễn Trần Thi Văn
NHÓM 10
Nội dung
Observer Parttern là gì?
Khi nào dùng Observer Pattern ?
Cấu trúc của mẫu
Ưu - nhược điểm
Các mẫu liên quan
Ứng dụng
Demo
2
Bài toán đặt ra
?$
3
Bài toán đặt ra
Bank Account
4
Observer Parttern là gì?
Tên: Observer (Behavioral)
Mục đích: Mẫu định nghĩa mối
phụ thuộc một - nhiều giữa các đối tượng để
khi mà một đối tượng có sự thay đổi trạng thái, tất các thành phần phụ thuộc
của nó sẽ được thông báo và cập nhật một cách tự động.
Tên khác: Dependents, Publish-Subscribe
5
Khi nào dùng Observer ?
Sử dụng mẫu Observer trong các trường hợp nào sau đây:
•
Khi bạn muốn các đối tượng liên lạc với nhau
•
Khi một đối tượng có thể thông điệp thì các đối tượng đăng ký lắng nghe
thông điệp này và phản ứng lại với thông điệp đó.
6
Cấu trúc
notify()
SUBJECT
OBSERVER
7
register()
Cấu trúc
class Observ er Patte...
Subject
+
+
+
Attach(Observer)
Detach(Observer)
Notify()
+observers
Observer
ConcreteSubj ect
-
subjectState
+
+
GetState()
SetState()
+
for all in observers {
o->Update()
}
+subject
return subjectState
Update()
ConcreteObserv er
-
observerState
+
Update()
Nguồn: “Design Patterns: Elements of Reusable Object-Oriented Software” - Gang of Four
observerState =
subject->GetState()
8
Cấu trúc
class Observ er Patter...
Subj ect
+
observerCollection
+
+
+
registerObserver(Observer) : void
removeObserver(Observer) : void
notifyObserver() : void
«interface»
Observ er
+
update()
notifyObserv er().
for obsev er onObserv erCollection call observ er.update()
ConcreteObserv er
+
+
update()
//other observer spefic method()
9
Cấu trúc
Nguồn: “Design Patterns: Elements of Reusable Object-Oriented Software” - Gang of Four
10
EmailObserver
Giải quyết bài toán với observer
Subject
Account
Register
Notify
Remove
11
MobileObserver
Ưu điểm của mẫu
Subject và observers có thể được sửa đổi một cách độc lập.
Đối tượng có thể được tái sử dụng mà không cần sử dụng lại các observers, và
ngược lại.
Observers có thể được thêm vào mà không sửa đổi các subject hay các
Observers khác.
12
nhược điểm của mẫu
Một hoạt động dường như vô hại trên đối tượng có thể gây ra một loạt các cập
nhật cho các observer và các đối tượng phụ thuộc nó.
Các tiêu chí phụ thuộc không được xác định rõ hoặc duy trì thường dẫn đến
các bản cập nhật giả mạo, có thể khó theo dõi.
Không có giao thức bổ sung để giúp các observer khám phá những gì đã thay
đổi
13
Ứng dụng
Observer pattern hay được sử dụng trong các trường hợp sau:
Xử lí với Event: Java Swing và .Net sử dụng Observer pattern để xử lí các event trên
giao diện. Các event và Delegate hoạt động như Subject và các Observer
Mô hình MVC: Trong mô hình MVC thì View tương ứng là các Observer, còn Model là
Subject
Ví dụ
Tin nhắn khuyến mãi của nhà mạng di động
Tính năng theo dõi trên mạng xã hội: Facebook, Youtube,…
14
Các mẫu liên quan
Mediator: bằng cách đóng gói những cập nhật ngữ cảnh phức tạp,
ChangeManager hoạt động như đối tượng Mediator giữa các đối tượng và các
Observer.
Singleton: các ChangeManager có thể là Singleton để nó trở nên duy nhất và
được truy cập toàn cục
15
Demo
class DemoObserv ...
Subject
Observer
+
doSomeThing(double, double) : void
MobileObserv er
-
concreteAccount: ConcreteAccount
+
+
MobileObserver(ConcreteAccount)
doSomeThing(double, double) : void
EmailObserv er
-
concreteAccount: ConcreteAccount
+
+
EmailObserver(ConcreteAccount)
doSomeThing(double, double) : void
+
+
+
Register(Observer) : void
Remove(Observer) : void
notifyAllObserver(double) : void
-concreteAccount
ConcreteAccount
+
+
+
+
-concreteAccount +
+
+
+
observers: ArrayList = new ArrayList()
balance: double
ConcreteAccount(double)
notifyAllObserver(double) : void
Register(Observer) : void
Remove(Observer) : void
getBalance() : double
setBalance(double) : void
transfer(double) : void
16