Mẫu thiết kế phương thức mẫu cho phép bạn xác định các bước của một thuật toán trong một phương thức duy nhất của một lớp. Điều này cho phép bạn giới hạn các hoạt động cụ thể của một ứng dụng trong một phương pháp duy nhất.
Mỗi bước của thuật toán mà phương thức khuôn mẫu xác định là một phương thức bên trong. Tuy nhiên, phương thức khuôn mẫu chỉ xử lý việc triển khai một số phương thức bên trong của nó. Các lớp con thường triển khai một hoặc nhiều phương thức bên trong của phương thức khuôn mẫu.
Một lớp con có thể triển khai một phương thức trừu tượng, nhưng nó không thể xác định lại thuật toán được thực hiện bởi một phương thức cuối cùng.
Cách thức hoạt động của phương pháp mẫu
Một mẫu phương pháp mẫu điển hình sẽ có cấu trúc sau:
final void templateMethod() {
abstractOperation1();
abstractOperation2();
concreteOperation1();
concreteOperation2();
hook();
}
Điều quan trọng đầu tiên cần lưu ý là templateMethod () là cuối cùng, vì vậy không lớp con nào có thể ghi đè phương thức này. Điều quan trọng khác cần lưu ý là ba loại phương thức mà mẫu phương thức khuôn mẫu sử dụng: cụ thể, trừu tượng và móc.
Lớp trừu tượng chứa phương thức khuôn mẫu thực hiện tất cả các phương thức cụ thể của nó, trong khi các lớp con cụ thể thực hiện các phương thức trừu tượng của nó. Phương thức hook thường không làm gì theo mặc định, nhưng một lớp con có khả năng ghi đè các phương thức này khi cần thiết.
Triển khai mẫu phương pháp mẫu trong Java
Mẫu phương pháp mẫu hoạt động như một khuôn khổ cho một ứng dụng. Vì vậy, bạn sẽ thường thấy mẫu này trong các khuôn khổ phần mềm cung cấp kế hoạch chi tiết cho việc phát triển ứng dụng.
Ví dụ: bạn có thể kết nối ứng dụng của mình với một trong nhiều hệ thống cơ sở dữ liệu. Các bước để kết nối và sử dụng cơ sở dữ liệu tuân theo một mẫu tương tự:
public abstract class Database {
final void databaseTemplate() {
setDBDriver();
setCredentials();
connect();
createDB();
setData();
readData();
if (userWantsToUpdate()) {
updateData();
}
if (userWantsToDelete()) {
deleteData();
}
closeConnection();
}
abstract void setDBDriver();
abstract void setCredentials();
abstract void createDB();
abstract void setData();
abstract void readData();
abstract void updateData();
abstract void deleteData();
void connect() {
System.out.println("Connecting to database...");
}
void closeConnection() {
System.out.println("Destroying database connection...");
}
boolean userWantsToUpdate() {
return false;
}
boolean userWantsToDelete() {
return false;
}
}
Ví dụ này Lớp cơ sở dữ liệu sử dụng mẫu phương thức mẫu để tạo một mẫu mà bạn có thể sử dụng với bất kỳ cơ sở dữ liệu nào. Để sử dụng cơ sở dữ liệu, ứng dụng của bạn sẽ cần kết nối với nó, sau đó hủy kết nối sau khi sử dụng. Các hoạt động này thường giống nhau đối với tất cả các cơ sở dữ liệu. Do đó, lớp Cơ sở dữ liệu trừu tượng có thể triển khai liên kết() và đóng kết nối() các phương pháp.
Các phương thức khác trong phương pháp mẫu sẽ khác nhau dựa trên loại cơ sở dữ liệu. Ví dụ: cơ sở dữ liệu MySQL lưu trữ dữ liệu trong các bảng, trong khi cơ sở dữ liệu MongoDB lưu trữ dữ liệu trong các bộ sưu tập. Nếu bạn muốn sử dụng cơ sở dữ liệu MySQL trong Java, chỉ cần tạo một lớp MySQL mới mở rộng lớp Cơ sở dữ liệu:
public class MySQL extends Database {
@Override
void setDBDriver() {
System.out.println("Selecting MySQL driver...");
}
@Override
void setCredentials() {
System.out.println("Setting MySQL database Credential...");
}
@Override
void createDB() {
System.out.println("Creating a new table...");
}
@Override
void setData() {
System.out.println("Inserting data into database...");
}
@Override
void readData() {
System.out.println("Retrieving data from database...");
}
@Override
void updateData() {
System.out.println("Updating data in database...");
}
@Override
void deleteData() {
System.out.println("Deleting data from database...");
}
}
Lớp MySQL thực thi tất cả các phương thức trừu tượng của lớp Cơ sở dữ liệu. Nó cũng có thể ghi đè một số phương pháp cụ thể. Tuy nhiên, nó không thể chạm vào databaseTemplate () sử dụng từ khóa cuối cùng.
public class Main {
public static void main(String[] args) {
Database mySQLDB = new MySQL();
mySQLDB.databaseTemplate();
}
}
Lớp Chính này tạo một đối tượng cơ sở dữ liệu MySQL mới và sử dụng phương thức mẫu để mô phỏng cách một ứng dụng sẽ kết nối với cơ sở dữ liệu. Chạy phương thức chính sẽ in kết quả sau ra bảng điều khiển:
Trong đầu ra, bạn sẽ nhận thấy rằng ứng dụng không bao giờ gọi cập nhật dữ liệu() và deleteData () các phương pháp. Đây là lý do tại sao các phương thức hook lại quan trọng. Trong cơ sở dữ liệu SQL, bạn sẽ muốn tạo bảng mới, chèn dữ liệu và xem dữ liệu của mình. Tuy nhiên, bạn có thể không muốn cập nhật hoặc xóa dữ liệu. Do đó, các phương thức hook cung cấp cho các lớp con tùy chọn để kiểm soát các khía cạnh quan trọng này của thuật toán.
@Override
boolean userWantsToUpdate() {
return true;
}
Chỉ cần thêm đoạn mã ở trên vào lớp MySQL, ứng dụng hiện cập nhật dữ liệu trong cơ sở dữ liệu. Nếu bạn chạy lại lớp Chính, nó sẽ hiển thị đầu ra được cập nhật sau:
Như bạn có thể thấy, ứng dụng hiện đang cập nhật dữ liệu trong Cơ sở dữ liệu.
Lợi ích của việc sử dụng mẫu thiết kế phương pháp mẫu
Một lợi ích chính của mô hình phương pháp mẫu là nó thúc đẩy khả năng tái sử dụng phần mềm. Mẫu thiết kế này cũng hỗ trợ lập trình hiệu quả. Một lớp con chỉ cần triển khai các phương thức duy nhất cho hoạt động của nó.
Ngoài ra, một ứng dụng sử dụng mẫu phương thức mẫu sẽ an toàn hơn, vì các lớp bên ngoài không thể thay đổi cấu trúc hoạt động của nó.