Báo cáo cuối kỳ môn Lập trình hướng đối tượng - Đề tài: Observer Pattern - Đặng Hoàng Thông
Đại Học Quốc Gia Thành Phố Hồ Chí Minh
Trường Đại Học Khoa Học Tự Nhiên
Khoa Công Nghệ Thông Tin
BÁO CÁO SEMINAR | Design Pattern
LỚP 17CK_CL | Nhóm 8 | Trà Tắc
Môn:
Giảng Viên Hướng Dẫn, thầy:
Học Kì I
Năm học : 2018 – 2019 | 29/11/2018
1
OOP
–
17CK_CL
–
Trà Tắc
Mục Lục
Thành Viên ----------------------------------------------------
Nguyên Tắc Làm việc-----------------------------------------
Dẫn Nhập------------------------------------------------------
1. Nêu ra một ví dụ / bài toán có liên quan đến pattern.
2. Các giải quyết bài toàn không sử dụng pattern.
3. Nhược điểm của cách giải trên.
Observer Pattern ---------------------------------------------
4. Giới thiệu về pattern
Class Diagram & Source Code-------------------------------
5. Cách giải bài toán trên nếu sử dụng Observer Pattern
Tổng Kết-------------------------------------------------------
6. Một số bài toán khác cũng giải bằng Observer Pattern.
7. Đánh giá
Tacers Quiz ----------------------------------------------------
TACERS
2
OOP
–
17CK_CL
–
Trà Tắc
Thành Viên
Đặng Hoàng Thông
Nhóm Trưởng
1760434
Trần Minh Tuấn
Nguyễn Việt Anh
Đào Ánh Phượng
1760393
1760459
1760261
Thành viên
Thành viên
Thành viên
TACERS
3
OOP
–
17CK_CL
–
Trà Tắc
Nguyên Tắc Làm Việc
1. Đi đúng giờ.
2. Nộp bài đúng thời hạn.
3. Có trách nhiệm với những gì mình làm.
4. Đoàn kết để đạt đến mục tiêu chung.
5. Tôn trọng nhau.
6. Kết quả cuối cùng thu nhận được, phải là sự
đồng lòng của cả nhóm.
TACERS
4
OOP
–
17CK_CL
–
Trà Tắc
Dẫn Nhập
1. Nêu ra một ví dụ / bài toán có liên quan đến Observer Parttern
Giải quyết bài toán thực hiện phép chia lấy dư và phép chia lấy nguyên.
2. Cách giải quyết bài toán không sử dụng partern
class DivObserver {
int m_div;
class Subject {
int m_value;
public:
DivObserver m_div_obj;
ModObserver m_mod_obj;
public:
DivObserver(int div) {
m_div = div;
}
Subject() : m_div_obj(4),
m_mod_obj(3) {}
void set_value(int value) {
m_value = value;
notify();
void update(int val) {
cout << val << " div " <<
m_div << " is " << val / m_div <<
endl;
}
}
}; // end class
void notify() {
m_div_obj.update(m_value);
m_mod_obj.update(m_value);
}
class ModObserver {
int m_mod;
public:
}; // end class
ModObserver(int mod) {
m_mod = mod;
}
int main()
{
void update(int val) {
Subject subj;
subj.set_value(14);
cout << val << " mod " <<
m_mod << " is " << val % m_mod <<
endl;
_getch();
}
return 0;
}; // end class
}
Output
14 div 4 is 3
14 mod 3 is 2
3. Nhược điểm của cách giải trên
Số lượng và loại đối tượng trong class Subject hard-wired
Người dùng không thể tác động đến cấu hình này.
TACERS
5
OOP
–
17CK_CL
–
Trà Tắc
Observer Pattern
4. Giới thiệu về partern
Mẫu thiết kế Observer (Người quan sát) là: mẫu thiết kế có sự ảnh hưởng giữa các đối
tượng lẫn nhau, khi có một đối tượng thay đổi thì các đối tượng khác sẽ được thông
báo và tự động cập nhật.
Có thể hiểu Observer thuộc nhóm Behavioral Pattern là một mẫu thiết kế dành cho
việc một đối tượng khi thay đổi trạng thái của bản thân nó, thì các đối tượng đính
kèm theo cũng sẽ được thông báo.
Thiết lập sự phụ thuộc “một - nhiều” giữa các đối tượng.
TACERS
6
OOP
–
17CK_CL
–
Trà Tắc
Class Diagram & Source Code
5. Cách giải bài toán trên nếu sử dụng Observer Pattern
Subject
m_value : int
Observer
m_views
vector <Observer*>: m_views
<<pure virtual>>
update (value : int) : void
attach(Observer *obs) : void
set_val(value : int) : void
notify ( ) : void
ModObserver
DivObserver
m_mod : int
m_div : int
ModObserver(model : Subject*, mod : int)
update (v : int) : void
DivObserver(model : Subject*, div : int)
update (v : int) : void
______________
UML class diagram for Observer Pattern
TACERS
7
OOP
–
17CK_CL
–
Trà Tắc
Source Code
void update(int v) {
class Observer {
cout << v << " div " << m_div <<
" is " << v / m_div << endl;
public:
virtual void update(int value) = 0;
}; // end class
}
}; // end class
class Subject {
class ModObserver : public Observer {
int m_mod;
public:
int m_value;
vector <Observer*> m_views;
public:
ModObserver(Subject *model, int mod) {
void attach(Observer *obs) {
model->attach(this);
m_views.push_back(obs);
m_mod = mod;
}
}
void set_val(int value) {
void update(int v) {
cout << v << " mod " << m_mod <<
" is " << v % m_mod << endl;
}
m_value = value;
notify();
}
void notify() {
}; // end class
for (int i=0; i < m_views.size(); i++)
m_views[i]->update(m_value);
int main()
{
}
}; // end class
Subject subj;
DivObserver divObs1(&subj, 4);
DivObserver divObs2(&subj, 3);
ModObserver modObs3(&subj, 3);
subj.set_val(14);
class DivObserver : public Observer {
int m_div;
public:
DivObserver(Subject *model, int div){
model->attach(this);
m_div = div;
_getch();
}
return 0;
}
Output
14 div 4 is 3
14 div 3 is 4
14 mod 3 is 2
TACERS
8
OOP
–
17CK_CL
–
Trà Tắc
Tổng Kết
6. Một số bài toán khác cũng giải bằng Observer Pattern
• Chúng ta cần xây dựng một phần mềm theo dõi trạm quan sát thời tiết theo ba thông
số: nhiệt độ, độ ẩm, áp xuất và yêu
cầu được hiển thị trên 2 màn hình mà
họ đưa là A và B, tất cả sẽ được cập
nhật theo thời gian thực mỗi khi có
dữ liệu mới nhất từ trạm. Ngoài ra,
trạm quan sát cũng muốn "public"
những API để những lập trình viên
khác có thể viết ra những màn hình
hiển thị thời tiết của riêng họ.
• Công việc nhận thư tín từ post office
rồi gửi đến cho mọi người.
• Tổng đài gửi thông báo khuyến mãi đến cho khách hàng (họ có thể gửi yêu cầu
không muốn nhận những tin nhắn này nữa hoặc không làm gì cả ).
7. Đánh giá
Ưu điểm:
Nhược điểm:
• Kết nối giữa các đối tượng với nhau tốt
hơn.
• Các interface của Observer phải được
thực hiện trong ConcreteObServer bao
gồm cả kế thừa
• Nếu không triển khai đúng, Observer
sẽ thêm phức tạp dẫn đến giảm hiệu
suất của chương trình.
• Không sửa đổi nào được thực hiện cho
đối tượng để chứa một observer mới.
Observer mới chỉ cần thực hiện một
interface mà Subject nhận thức được và
sau đó đăng ký tới subject.
• Observer có thể thêm hoặc xoá đối tượng
bất cứ khi nào muốn.
• Các Subjects có thể được sử dụng lại mà
không có sự tham gia của các observers,
và cũng tương tự đối với các observers.
TACERS
9
OOP
–
17CK_CL
–
Trà Tắc
Tacers Quiz
1. What is the Observer Pattern’s group ?
a. Behavioral
b. Creational
c. Structural
2. Following the demo above, which of the following are concrete observers ?
(milti – choice)
a. DivObserver
b. ModObsever
c. Subject
d. Observer
e. None of the mentioned
3. Push (attach) and pull (detach) are the two ways for the obsevers to
update with subject changes ?
a. True
b. False
4. How often is it used ?
a. Rarely
b. Highly
c. All the mentioned are wrong
d. All the mentioned are right
5. Which Design Pattern should you use when when an object should be able
to notify other objects without making assumptions about who these objects
are. In other words, you don't want these objects tightly coupled.
a. Visitor
b. Adapter
c. Observer
d. Chain of reponsibility
TACERS 10
Bạn đang xem tài liệu "Báo cáo cuối kỳ môn Lập trình hướng đối tượng - Đề tài: Observer Pattern - Đặng Hoàng Thông", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bao_cao_cuoi_ky_mon_lap_trinh_huong_doi_tuong_de_tai_observe.docx
Group08_Mediator.pptx
Bài Tập.docx
Readme.txt

