Tải bản đầy đủ (.pdf) (10 trang)

Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng: Mẫu Strategy - Nguyễn Minh Huy

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (381.22 KB, 10 trang )

Mẫu Strategy
GV. Nguyễn Minh Huy

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
1


Mẫu Strategy
Ngữ cảnh
cảnh::
Bài toán
toán::
Sắp xếp mảng
mảng..
Thanh toán hóa đơn
đơn..
Vẽ một loại hình
hình..

Mục tiêu
tiêu::
Có nhiều thuật toán xử lý cho một phương thức
thức..
Có thể lựa chọn thuật toán khi chương trình thực hiện
hiện..
Có thể thay đổi thuật toán lựa chọn nhiều lần.
lần.



Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
2


Mẫu Strategy
Hướng tiếp cận
cận::
Nhiều thuật toán xử lý khác nhau
nhau::
Tạo lớp thuật toán tổng quát
quát..
Tạo lớp kế thừa cho mỗi thuật toán cụ thể.
thể.

Lựa chọn thuật toán xử lý cho phương thức
thức::
Trang bị đối tượng thuật toán cho lớp chứa phương thức
thức..
Khi gọi phương thức
thức,, nhờ đối tượng thuật toán thực hiện
hiện..

Thay đổi thuật toán lựa chọn nhiều lần:
lần:
Cho phép cập nhật đối tượng thuật toán đã trang bị.

bị.

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
3


Mẫu Strategy
Hướng tiếp cận
cận::

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
4


Mẫu Strategy
Cài đặt
đặt::
class Receipt
{
private:
Payment* m_pay
m_pay;;

public:
double calculate();
};
double Receipt::calculate()
{
return m_pay
m_pay-->calculate()
>calculate();;
}

class Payment
{
public:
virtual double calculate() = 0;
};
class CashPayment
CashPayment:: public Payment
{
public:
double calculate()
calculate();;
};
class CreditCardPayment
CreditCardPayment:: public Payment
{
public:
double calculate()
calculate();;
};


Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
5


Mẫu Strategy
Các vấn đề xung quanh
quanh::
Cập nhật đối tượng thuật toán bằng cách nào
nào?
?
Khởi tạo thông qua constructor.
Chỉ lựa chọn 1 lần,
lần, không thể thay đổi lần sau
sau..
Tạo phương thức truy xuất (get/set).
Phải lưu đối tượng thuật toán
toán..
Cập nhật thông qua tham số phương thức
thức..
class Receipt
{
private:
Payment* m_pay
m_pay;;
public:
Receipt(Payment* pay);

double calculate();
};

class Receipt
{
private:
Payment* m_pay
m_pay;;
public:
setPay(Payment*
setPay
(Payment* pay);
double calculate();
};

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

class Receipt
{
public:
double calculate(Payment*
calculate(Payment* pay);
pay);
};

/>
6



Mẫu Strategy
Các vấn đề xung quanh
quanh::
Phân biệt Strategy và Template Method:
Tiêu chí

Strategy

Template Method

Ý tưởng

- Thay đổi toàn bộ thuật toán
xử lý phương thức.
- “Thay da đổi thịt”.

- Thay đổi một vài bước trong
thuật toán xử lý phương thức.
- Giữ nguyên khung sườn.

Cài đặt

- Tách biệt cây thuật toán.
- Sử dụng composition đối
tượng thuật toán.

- Sử dụng inheritance trên
chính lớp chứa phương thức.


Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
7


Mẫu Strategy
Các vấn đề xung quanh
quanh::
Phân biệt Strategy và kế thừa trực tiếp
tiếp::
Giống nhau
nhau:: đều có thể thay đổi xử lý của phương thức
thức..
Tiêu chí

Strategy

Kế thừa trực tiếp

Tính chất

- Quan hệ HAS-A
(giữa Context và Algorithm)

- Quan hệ IS-A
(giữa Context và Algorithm)


Cài đặt

- Tách biệt cây thuật toán.

- Override lại phương thức.
“Bùng nổ” lớp kế thừa.

Linh động

- Lựa chọn thuật toán động
(khi nào cần).
- Thay đổi lựa chọn nhiều lần.

- Lựa chọn thuật toán cứng
(khi tạo lớp Context).

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>
8


Mẫu Strategy
Các vấn đề xung quanh
quanh::
Hạn chế
chế::
Tách biệt cây thuật toán

toán..
Không thể truy xuất thành phần private lớp Context.
class Receipt
{
private:
Payment* m_pay
m_pay;;
double m_tax
m_tax;;
public:
double calculate();
};
double Receipt::calculate()
{
return m_pay
m_pay-->calculate()
>calculate();;
}
Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

class CashPayment
CashPayment:: public Payment
{
public:
double calculate()
calculate();;
};
double CashPayment

CashPayment::calculate()
::calculate()
{
// Làm sao truy xuất m_tax
m_tax??
??
}

/>
9


Mẫu Strategy
Các vấn đề xung quanh
quanh::
Hạn chế
chế::
Cho phép thay đổi thuật toán xử lý.
lý.
Tạo nhiều đối tượng thuật toán
toán..
Tốn tài nguyên hệ thống
thống..
Áp dụng Singleton!!

Mẫu thiết kế hướng đối
tượng & ứng dụng - Nguyễn Minh Huy
CuuDuongThanCong.com

/>

10



×