Mẫu Template Method
Các vấn đề xung quanh:
Áp đặt quy trình khung với người dùng:
Chỉ cócó thểthể cải biên các bước con.
Tuân thủ quy trình thực hiện các bước.
Dùng protectedS
class Form {void main()
public:
void load() {
onBeforeLoad();();
// // Cài đặt load formS
onAfterLoad();();
}
protected:
virtual void onBeforeLoad() { }
virtual void onAfterLoad() { };
};};
{
Form f = new WelcomeForm();();
f.onAfterLoad();(); // // Lỗi
f.onBeforeLoad();(); // // Lỗi
f.load();();
}
8 trang |
Chia sẻ: thanhle95 | Lượt xem: 451 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng - Chương 5: Mẫu Template Method - Nguyễn Minh Huy, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Mẫu Template Method
GV. Nguyễn Minh Huy
1Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Ngữ cảnh:
Bài toán:
Xây dựng thuật toán khung.
Thiết lập event trong lập trình.
Cài đặt hook sự kiện.
Mục tiêu:
Một quy trình khung cố định.
Có thể cải tiến, mở rộng các bước trong quy trình.
Cải biên một phần phương thức.
2Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Hướng tiếp cận:
Cài đặt quy trình khung:
Dùng phương thức không ảo (non-virtual).
Cải tiến, mở rộng các bước trong quy trình:
Tách các bước cần sửa thành phương thức độc lập.
Phương thức khung gọi các phương thức này.
Các lớp kế thừa cải biên lại.
3Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Cài đặt:
class Form
{
public:
void load()
{
onBeforeLoad();
class WelcomeForm
{
public:
void onBeforeLoad()
{
// Load ảnh giới thiệuS
}// Cài đặt load formS
onAfterLoad();
}
virtual void onBeforeLoad() { }
virtual void onAfterLoad() { };
};
4Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
}
class LoginForm
{
public:
void onAfterLoad()
{
// Focus ô nhập usernameS
}
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Các vấn đề xung quanh:
Áp đặt quy trình khung với người dùng:
Chỉ có thể cải biên các bước con.
Tuân thủ quy trình thực hiện các bước.
Dùng protectedS
class Form { void main()
public:
void load() {
onBeforeLoad();
// Cài đặt load formS
onAfterLoad();
}
protected:
virtual void onBeforeLoad() { }
virtual void onAfterLoad() { };
};
5Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
{
Form f = new WelcomeForm();
f.onAfterLoad(); // Lỗi
f.onBeforeLoad(); // Lỗi
f.load();
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Các vấn đề xung quanh:
Áp dụng giảm trùng lặp mã nguồn:
Phương thức cải biên ở các lớp kế thừa có phần chung.
class Animal
{
public:
virtual void talk() = 0;
class Cat {
public:
void talk() {
prepareSound();
};
6Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
// Cài đặt kêu meo meoS
}
};
class Dog {
public:
void talk() {
prepareSound();
// Cài đặt kêu gâu gâuS
}
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Các vấn đề xung quanh:
Áp dụng giảm trùng lặp mã nguồn:
Tách phần chung thành Template Method.
Chuyển phần riêng thành Primitive Operation.
class Animal
{
class Cat {
protected:
public:
void talk()
{
prepareSound();
doTalk();
}
protected:
virtual doTalk() = 0;
};
7Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
void doTalk() {
// Cài đặt kêu meo meoS
}
};
class Dog {
protected:
void doTalk() {
// Cài đặt kêu gâu gâuS
}
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mẫu Template Method
Các vấn đề xung quanh:
Áp dụng tránh quên gọi phương thức cha:
Phương thức cha cung cấp cài đặt mặc định.
Phương thức con cải biên và gọi lại cha.
class Button {
public:
class Button {
public:
virtual void onDraw() {
// Cài đặt mặc địnhS
}
};
class CustomButton {
public:
void onDraw() {
// Cài đặt vẽS
Button::onDraw();
}
};
8Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
virtual void onDraw() {
hookOperator();
// Cài đặt mặc địnhS
}
};
class CustomButton {
protected:
void hookOperation() {
// Cài đặt vẽS
}
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt