Tải bản đầy đủ (.pptx) (16 trang)

Thiết kế phần mềm hướng đối tượng OBSERVER PATTERN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (515.29 KB, 16 trang )

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



×