Báo Cáo Môn Học Thiết Kế Phần Mềm Hướng Đối Tượng Đề Tài Mẫu Thiết Kế TEMPLATE METHOD PATTERNBáo Cáo Môn Học Thiết Kế Phần Mềm Hướng Đối Tượng Đề Tài Mẫu Thiết Kế TEMPLATE METHOD PATTERNBáo Cáo Môn Học Thiết Kế Phần Mềm Hướng Đối Tượng Đề Tài Mẫu Thiết Kế TEMPLATE METHOD PATTERN
Trang 1
Báo cáo môn học:
THIẾT KẾ PHẦN MỀM HƯỚNG ĐỐI TƯỢNG
Đề tài:
TEMPLATE METHOD PATTERN
Trang 2MỤC LỤC
PHÂN CÔNG CÔNG VIỆC 3
1 Đặt vấn đề 4
2 Định nghĩa 6
3 Cấu trúc 6
4 Vai trò 7
5 Hệ quả 7
6 Vận dụng 7
7 Các mẫu liên quan 7
8 Ứng dụng thực tế 7
9 Tài liệu tham khảo 8
Trang 3PHÂN CÔNG CÔNG VIỆC
1 Nguyễn Trần Cát Tiên
12110190 Tìm hiểu và trình bày: “Dẫn nhập - Định nghĩa”.
2 Lê Đức Phi
12110140 Tìm hiểu và trình bày: “Cấu trúc – Ý nghĩa”.
3 Ngô Thanh Lịch
12110096 Tìm hiểu và trình bày: “Hệ quả - Vận dụng”.
4 Nguyễn Văn Tuấn
12110226 Tìm hiểu và trình bày: “Các mẫu liên quan - Ví dụ”.
5 Bùi Thị Thúy Quỳnh
12110157 Chạy Demo.
Trang 41 Đặt vấn đề.
Vấn đề 1: Để thực hiện một câu truy vấn trong các hệ quản trị ta cần làm gì?
Tuy các hệ quản trị khác nhau nhưng nếu muốn thực hiện câu truy vấn đến cơ sở
dữ liệu thì hệ quản trị nào cũng phải qua các bước:
- Kết nối đến cơ sở dữ liệu
- Thực hiện câu truy vấn
- Ngắt kết nối tới cơ sở dữ liệu
Các bước này được thực hiện theo một khuôn mẫu có trước Cách thức kết nối
cơ sở dữ liệu, thực hiện truy vấn, ngắt kết nối thì được cài đặt tùy theo từng hệ quản trị khác nhau
Vấn đề 2: Thực hiện các yêu cầu sau:
- Sắp xếp mảng số nguyên n phần tử theo thứ tự tăng dần
- Sắp xếp mảng số nguyên n phần tử theo thứ tự giảm dần
Ta cài đặt các class sort giải quyết các yêu cầu
class SortUp { class SortDown {
Trang 5void sort(int A[],int n){
for(int i=0;i<n;i++)
for(int j=i;j<n;j++) if(A[i]>A[j]) Swap(A[i],A[j]);
}
private:
void Swap(int &a,int &b) {
int t=a;
a=b;
b=t;
}
};
public : void sort(int A[],int n) { for(int i=0;i<n;i++)
for(int j=i;j<n;j++) if(A[i]<A[j])
Swap(A[i],A[j]);
} private:
void Swap(int &a,int &b) {
int t=a;
a=b;
b=t;
} };
Ta nhận thấy rằng hai hàm sortUp và sortDown có cấu trúc tương tự nhau và chỉ khác nhau ở điều kiện so sánh
Ý tưởng như sau:
Tổ chức điều kiện so sánh thành hàm isSwap, tạo lớp AbstractSort cơ sở có cấu trúc chung cho sortUp và sortDown, sau đó cho sortUp và sortDown kế thừa lớp sort và định nghĩa lại hàm isSwap(int,int)
class AbstractSort {
public:
void sort(int A[],int n) {
for(int i=0;i<n;i++)
Trang 6for(int j=i;j<n;j++)
if(isSwap(A[i],A[j])
Swap(A[i],A[j]);
}
private:
virtual bool isSwap(int , int )=0;
void Swap(int &a,int &b) {
int t=a;
a=b;
b=t;
}
};
class SortUp: public AbtractSort {
bool isSwap(int a,int b) {
return(a>b);
}
};
class SortDown: public AbtractSort {
bool isSwap(int a,int b){
return(a<b);
Trang 7}
};
Trong tình huống trên ta đã tạo bộ khung cho thuật toán sort và để bước so sánh cho lớp con cài đặt, lớp cơ sở có nhiệm vụ khai báo khuôn dạng cho hàm so sánh này
Thực tế trong lập trình có rất nhiều trường hợp tương tự như trường hợp trên, chúng ta có một bộ khung chung và giao một số bước nhất định cho lớp con định nghĩa lại theo yêu cầu cụ thể nào đó Các chuyên gia thiết kế đã nghiên cứu và tổng quát hóa vấn đề trên thành mẫu Template Method
2 Định nghĩa.
- Mẫu Template Method là một mẫu thiết kế thuộc nhóm Behavioral Pattern
- Mẫu Template Method tạo ra bộ khung của một thuật toán, ủy thác việc cài đặt một vài bước trong thuật toán đó cho các lớp con Các lớp con định nghĩa lại các bước này để phù hợp với yêu cầu cụ thể mà không cần thay đổi cấu trúc của thuật toán
3 Cấu trúc
Trang 8- AbstractClass:
Định nghĩa các abstract primitive operation (gồm các gái trị trả về, tên phương thức), các thao tác này được định nghĩa lại ở các lớp con cụ thể để thực hiện các bước của một thuật toán
Cài đặt một template method định nghĩa bộ khung của thuật toán Template method này gọi các primitive operation như các phương thức được định nghĩa trong AbstractClass (hoặc một số đối tượng khác)
- ConcreteClass: thực hiện primitive operation nhưng cài đặt lại nội dung phù hợp với mỗi class riêng và cũng thực hiện các bước đã chỉ ra trong template method
4 Vai trò.
Mẫu Template Method cho phép các thuật toán bảo lưu một số bước cho lớp con Cấu trúc của thuật toán không thay đổi, nhưng các bộ phận nhỏ được xác định hoạt động của nó được xử lý ở nơi khác
5 Hệ quả.
Trang 9- Ưu điểm:
Có khả năng tái sử dụng code, tránh sự trùng lặp code trong các class
Có cấu trúc điều khiển ngược (Inverted Control Structure)
Lợi dụng tính đa hình của lớp cha để gọi các lớp con, các lớp con sẽ thừa kế những thuộc tính đã có của lớp cha mà không phải cài đặt lại
- Nhược điểm:
Khả năng giao tiếp kém
Khó khăn trong việc thiết lập các chức năng
Khó khăn để hiểu được chương trình
Khó khăn trong việc duy trì
6 Vận dụng.
Template method nên được sử dụng trong các trường hợp sau:
- Cài đặt các phần cố định của một thuật toán và để lại các phương thức có thể thay đổi theo yêu cầu do các lớp con cài đặt
- Tránh sự trùng lặp mã nguồn: các đoạn mã chung trong các lớp
con có thể được tách ra và đưa vào trong phần cài đặt của lớp cơ sở.
- Điều khiển mở rộng các lớp con Ta có thể định nghĩa một
Template Method, nó gọi các thao tác ‘‘hook’’ tại các điểm đặc biệt, bằng cách đó cho phép các mở rộng chỉ tại điểm đó.
7 Các mẫu liên quan.
- Factory Method thường được gọi bởi Template Method.
- Template sử dụng thừa kế để thay đổi một phần của thuật toán.
Strategy sử dụng delegation để chỉnh sửa toàn bộ thuật toán.
Trang 108 Ứng dụng thực tế.
class TemplateMethod
HouseTemplate
+ buildDoor(): void
+ buildFoundation(): void + buildHouse(): void
+ buildPillars(): void + buildWall(): void
+ buildWindows(): void + HouseTemplateMethod()
WoodenHouse
+ buildDoor(): void
+ buildPillars(): void
+ buildWall(): void
GlassHouse
+ buildDoor(): void + buildPillars(): void + buildWall(): void
Muốn xây được một ngôi nhà thì ta đều trải qua các bước:
- Xây nền
- Xây cột
- Xây tường
- Lắp cửa sổ và cửa chính
- Xây mái nhà
Trang 11Nhưng nếu muốn xây nhà gỗ thì tường, cột, cửa chính thì phải xây theo kiểu của nhà gỗ còn nhà kính thì phải xây theo kiểu của nhà kính chứ không thể xây giống nhau được
Trong ví dụ trên ta đã tạo bộ khung cho thuật toán xây nhà và để bước xây tường, xây cửa, xây cột cho lớp con cài đặt, lớp cơ sở có nhiệm vụ khai báo khuôn dạng cho phương thức HouseTemplateMethod.
9 Tài liệu tham khảo.
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides Addison-Wesley Pub Co; Design Patterns Elements of Reusable Object-Oriented Software; 1st edition (January 15, 1995).
[2] Địa chỉ web: http://www.dofactory.com/net/template-method-design-pattern
[3] Địa chỉ web: http://www.oodesign.com/template-method-pattern.html