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:
Ph
ương
pháp
Lập
trình H
ướng đối
t
ượng  
Giảng Viên Hướng Dẫn, thầy:
Hồ Tuấn
Thanh  
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  
docx 10 trang myanh 28700 Free
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:

  • docxbao_cao_cuoi_ky_mon_lap_trinh_huong_doi_tuong_de_tai_observe.docx
  • pptxGroup08_Mediator.pptx
  • docxBài Tập.docx
  • txtReadme.txt