Chúng tôi cũng muốn cảm ơn những người bạn đã chia sẻ kiến thức, ý kiếnvà góp ý quý báu, giúp chúng tôi vượt qua những thách thức trong quá trìnhnghiên cứu và phát triển phần mềm.Không t
Trang 1TRƯỜNG ĐẠI HỌC XÂY DỰNG HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
MÔN CÔNG NGHỆ PHẦN MỀM
TIỂU LUẬN 4
1 Tìm hiểu mẫu Observer design pattern Vẽ lại biểu đồ lớp cho thiết kế giảng viên đưa ra được vẽ bằng tay
2 Từ biểu đồ thiết kế và bài toán giảng viên đưa ra, hãy cài đặt đầy đủ nhất
có thể cho bài toán thiết kế này bằng ngôn ngữ lập trình Java
Giáo viên giảng dạy: Lê Thị Hoàng Anh
Nhóm: 7 – Lớp 67IT4
Thành viên nhóm:
0093667 Nguyễn Quang Nghĩa
Cài đặt Java
0003167 Hồ Sỹ Chinh
0073367 Đinh Bùi Nam
0162167 Cao Việt Linh Vẽ lại biểu đồ lớp
4010067 Trịnh Ngọc Quang Tìm hiểu mẫu Observer
design pattern
Hà Nội, 24.02.2024
Trang 2Mục Lục:
Lời cảm ơn 3
I Mẫu Observer design pattern 4
1 Định nghĩa 4
2 Mục tiêu 4
3 Ưu & nhược điểm 4
Ưu điểm: 4
Nhược điểm: 4
4 Tính áp dụng 4
5 Cấu trúc 5
Subject : 5
Observer : 5
ConcreteSubject : 5
ConcreteObserver : 6
II Vẽ biểu đồ lớp cho thiết kế giảng viên đưa ra 7
III Cài đặt 8
Trang 3Lời cảm ơn
Chúng tôi xin gửi lời cảm ơn chân thành đến những người đã đóng góp vào thành công của Bài tập lớn Công nghệ Phần mềm này
Đầu tiên và quan trọng nhất, chúng tôi muốn bày tỏ lòng biết ơn đặc biệt đến cô Lê Thị Hoàng Anh Sự hướng dẫn, kiến thức và tận tâm của cô đã đóng vai trò quan trọng trong việc hình thành và phát triển kiến thức của chúng tôi về Công nghệ Phần mềm
Chúng tôi cũng muốn cảm ơn những người bạn đã chia sẻ kiến thức, ý kiến
và góp ý quý báu, giúp chúng tôi vượt qua những thách thức trong quá trình nghiên cứu và phát triển phần mềm
Không thể không kể đến sự hỗ trợ từ gia đình và bạn bè, những người đã hiểu và ủng hộ chúng tôi suốt quá trình nghiên cứu Những lời động viên và sự
hỗ trợ tinh thần từ họ đã đóng góp quan trọng vào sự thành công của chúng tôi Cuối cùng, chúng tôi xin bày tỏ lòng biết ơn sâu sắc đến tất cả những người
đã đồng hành và đóng góp vào hành trình nghiên cứu của chúng tôi
Trang 4I Mẫu Observer design pattern
1 Định nghĩa
Observer design pattern là một mẫu thiết kế phần mềm mà một đối tượng, gọi là subject, duy trì một danh sách các thành phần phụ thuộc nó, gọi
là observer, và thông báo tới chúng một cách tự động về bất cứ thay đổi nào, thường thì bằng cách gọi 1 hàm của chúng
2 Mục tiê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
Một đối tượng có thể thông báo đến một số lượng không giới hạn các đối tượng khác
3 Ưu & nhược điểm
Ưu điểm:
Đảm bảo nguyên tắc Open/Closed Principle (OCP): Cho phép thay đổi Subject và Observer một cách độc lập Chúng ta có thể tái sử dụng các Subject mà không cần tái sử dụng các Observer và ngược lại Nó cho phép thêm Observer mà không sửa đổi Subject hoặc Observer khác
Thiết lập mối quan hệ giữa các objects trong thời gian chạy
Sự thay đổi trạng thái ở 1 đối tượng có thể được thông báo đến các đối tượng khác mà không phải giữ chúng liên kết quá chặt chẽ
Không giới hạn số lượng Observer
Nhược điểm:
Unexpected update: Bởi vì các Observer không biết về sự hiện diện của nhau, nó có thể gây tốn nhiều chi phí của việc thay đổi Subject
Subscriber được thông báo theo thứ tự ngẫu nhiên
4 Tính áp dụng
Sử dụng Observer Patern khi chúng ta muốn:
Sự thay đổi trạng thái ở 1 đối tượng cần được thông báo đến các đối tượng khác mà không phải giữ chúng liên kết quá chặt chẽ
Trang 5 Cần mở rộng dự án với ít sự thay đổi nhất.
Khi abstraction có 2 khía cạnh, cái này phụ thuộc cái kia Đóng gói các khía cạnh này trong các đối tượng khác nhau cho phép bạn thay đổi
và tái sử dụng chúng độc lập
Khi thay đổi một đối tượng yêu cầu việc thay đổi đến các đối tượng khác, và bạn không biết số lượng đối tượng cần thay đổi
Khi một đối tượng thông báo các đối tượng khác mà không cần biết đối tượng đó là gì hay nói cách khác là tránh tightly coupled
5 Cấu trúc
Subject :
o Là đối tượng chứa thông tin hoặc trạng thái cần được theo dõi
o Cung cấp các phương thức để thêm, xóa hoặc thông báo cho các observers khi trạng thái của nó thay đổi
Observer :
o Là các đối tượng quan tâm đến trạng thái của subject và cần nhận thông báo khi trạng thái của subject thay đổi
o Định nghĩa một phương thức cập nhật để subject có thể gọi khi có
sự thay đổi
ConcreteSubject :
o Là một lớp cụ thể của Subject, triển khai các phương thức của Subject và giữ danh sách các observers
o Khi trạng thái của nó thay đổi, nó sẽ thông báo cho tất cả các observers của nó
Trang 6 ConcreteObserver :
o Có thể duy trì một liên kết đến đối tượng ConcreteSubject
o Lưu trữ trạng thái của subject
o Thực thi việc cập nhật để giữ cho trạng thái đồng nhất với subject gửi thông báo đến
Ta có thể hình dung sự tương tác giữa subject và các observer như sau: Khi subject có sự thay đổi trạng thái, nó sẽ duyệt qua danh sách các observer của nó và gọi phương thức cập nhật trạng thái ở từng observer, có thể truyền chính nó vào phương thức để các observer có thể lấy ra trạng thái của nó
và xử lý
Trang 7II Vẽ biểu đồ lớp cho thiết kế giảng viên đưa ra
Trang 8III Cài đặt
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java
to edit this template
*/
package baitaplon ;
/**
*
* @author Admin
*/
import java util ArrayList ;
import java util List ;
// Interface ISubject
interface ISubject {
void attach( Observer observer);
void detach( Observer observer);
void notifyAllObserver();
}
// Interface IObserver
interface Observer {
void update( DBvariableE varDBe);
void ConnectDB( DBvariableE varDBe);
}
// Class DBvariableE
class DBvariableE {
String varE ;
public DBvariableE( String varE ) {
this.varE = varE ;
}
}
// Class ConnectDB
class ConnectDB implements ISubject {
private final List Observer < > observers = new ArrayList<>(); private DBvariableE varDBe ;
@ Override
public void attach( Observer observer ) {
observers add(observer );
Trang 9}
@ Override
public void detach( Observer observer ) {
observers remove ( observer );
}
@ Override
public void notifyAllObserver () {
for ( Observer observer : observers ) {
observer.update(varDBe);
}
}
public boolean checkChangeVariableEnvironment( String oldVarE ) { return true ; // For example purposes
}
public void connectToDB () {
String oldVarE = "oldValue" ;
( if checkChangeVariableEnvironment(oldVarE )) {
this.notifyAllObserver();
}
}
}
// Class MySQLDBcon
class MySQLDBcon implements Observer {
@ Override
public void ConnectDB( DBvariableE varDBe ) {
System out println ( "Connecting to MySQL database " ); }
@ Override
public void update( DBvariableE varDBe ) {
System out println ( "Updating MySQL database " ); }
}
// Class SQLServerDBcon
class SQLServerDBcon implements Observer {
@ Override
public void ConnectDB( DBvariableE varDBe ) {
System out println ( "Connecting to SQL Server database " ); }
Trang 10
@ Override
public void update( DBvariableE varDBe ) {
System out println ( "Updating SQL Server database " ); }
}
// Class MongoDBcon
class MongoDBcon implements Observer {
@ Override
public void ConnectDB( DBvariableE varDBe ) {
System out println ( "Connecting to MongoDB database " ); }
@ Override
public void update( DBvariableE varDBe ) {
System out println ( "Updating MongoDB database " ); }
}
public class Main {
public static void main( String [] args ) {
// Tạo một đố? i tượng ConnectDB
ConnectDB connectDB = new ConnectDB();
// Tạo các đố? i tượng Observer
MySQLDBcon mySQLDBcon = new MySQLDBcon(); SQLServerDBcon sqlServerDBcon = new SQLServerDBcon(); MongoDBcon mongoDBcon = new MongoDBcon(); // Đăng ký các Observer với ConnectDB
connectDB attach ( mySQLDBcon );
connectDB attach ( sqlServerDBcon );
connectDB attach ( mongoDBcon );
// Khi có sự thay đốK i trong mối trường biế? n, kế? t nố? i và cập
String oldVarE = "oldValue" ;
( if connectDB checkChangeVariableEnvironment ( oldVarE )) { connectDB connectToDB ();
} else {
System out println ( "No change in variable environment
Database connection not required." ); }
}
}