Strategy: được định nghĩa là giao diện dùng chung cho các thuật toán được cài đặt.. Context sử dụng giao diện này để gọi các thuật toán được định nghĩa bởi ConcreteStrategy.. Concret
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC THIẾT KẾ PHẦN MỀM HƯỚNG ĐỐI TƯỢNG
STRATEGY PATTERN
GVHD: Ths Nguyễn Trần Thi Văn
TP.HCM , tháng 05 năm 201 7
Trang 21 Đặt vấn đề
Giả sử chúng ta nhận được yêu cầu viết 1 chương trình để đọc file txt Rồi sau
đó yêu cầu phát sinh, chúng ta phải viết các hàm đọc file csv, xls… Chúng ta không thể viết như thể viết các method lần lượt là:
…
Phương pháp này giúp bạn giải quyết nhanh vấn đề trong bài toán nhỏ Nhưng 1 khi project của bạn lớn theo từng ngày, bạn không thể viết theo kiểu lập trình thủ tục này được Nó tiềm ẩn nhiều rủi ro và vi phạm nguyên tắc hướng đối tượng:
Bạn thử tưởng tượng xem, nếu chương trình bạn có khả năng đọc tới 100 files, bạn
sẽ có 100 methods, và mình nghĩ là bạn sẽ rối và khó quản lý chúng
Ví dụ để hiểu
Giả sử tôi có 1 cô bạn nữ Vào những ngày cuối tuần, tôi thường dẫn cô ấy đi chơi giải trí Tất nhiên đi chơi phải có chiến lược (strategy), nếu không thì sớm gặp thất bại Tôi đã vạch sẵn trong đầu (server), hàng tá kế hoạch đi chơi (many algorithms) Tham khảo nguyên nhân thất bại 2 lần trước:
Lần 1: Tôi chỉ cài đặt 1 hàm đi chơi, và mỗi lần muốn tìm chỗ mới, tôi ngồi sửa hàm Sửa kịp thì không sao Sửa không kịp thì tới ngày đi chơi, tôi đành cancel Phương pháp này chiếm tỉ lệ thất bại hơn 75%
Lần 2: Tôi quyết định thay đổi hàm đi chơi Thay vì viết 1 hàm, tôi viết hơn sẵn 1 chục hàm Tới khi gặp cô ấy, tôi đưa ra nhiều lời đề nghị, nhưng hình như cô ấy không vui vì tôi luôn áp đặt nhiều cách đi chơi mà cô ấy không thích Tỷ lệ thành công 50-50
Sau nhiều ngày vắt óc, tôi quyết định thay đổi tư tưởng khi đi chơi Đi chơi phải đơn giản, và cho người ta quyết định đi chơi ở đâu, không phải là mình đưa ra
Để đơn giản, tôi quyết định dùng 1 hàm duy nhất là Đi Chơi() để bạn ấy khỏi lựa chọn nhiều (lựa chọn về nhà :(( là tiêu) Để bạn ấy tùy hứng theo tâm trạng mà chọn tiết mục đi chơi nào, tôi quyết định cài đặt sẵn 1 số ý tưởng (implement
Trang 3interface), rồi tùy theo tình huống (runtime), cô ấy sẽ quyết định sẽ chọn Cách đi chơi nào (behaviour)
Code cài đặt:
public interface ICachDiChoi
{
void DiChoi();
}
public class DiUongNuoc: ICachDiChoi
{
public void DiChoi()
{
Console.WriteLine("Di uong nuoc");
}
}
public class AnBinhTrong: IHuman
{ //Cài đặt ngầm ý tưởng
private readonly ICachDiChoi _cachDiChoi;
public AnBinhTrong(ICachDiChoi cachDiChoi)
{
_cachDiChoi = cachDiChoi;
}
public void DanBanGaiDiChoi()
{
Trang 4_cachDiChoi.DiChoi();
}
}
class Program
{ //Bạn gái quyết định đi đâu
static void Main(string[] args)
{
var abt = new AnBinhTrong(new DiUongNuoc()); abt.DanBanGaiDiChoi();
}
}
Trang 52 Giới thiệu
Strategy pattern:
là mẫu thiết thuộc Behavioral Pattern nó được dùng để quản lý các thuật toán, mối liên quan giữa các object với nhau
cung cấp một họ giải thuật cho phép client chọn lựa linh động một giải thuật cụ thể khi sử dụng
Khi nào bạn dùng mẫu Strategy pattern: khi bạn muốn chọn thuật
toán để chạy lúc runtime
3 Mục đích sử dụng của mẫu
Giảm độ phức tạp của mã nguồn
Tránh sự rắc rối, khi phải hiện thực một chức năng nào đó qua quá nhiều lớp con
Tiết kiệm tài nguyên hệ thống
Dễ tu sửa, bảo dưỡng
4 Cấu trúc, các lớp/đối tương tham gia
Cấu trúc:
Các thành phần tham gia:
Trang 6 Strategy: được định nghĩa là giao diện dùng chung cho các thuật toán được cài đặt Context sử dụng giao diện này để gọi các thuật toán được định nghĩa bởi ConcreteStrategy
ConcreteStrategy: kế thừa những thuật toán được sử dụng bởi giao diện Strategy
Context: Được cấu hình thông qua các đối tượng ConcreteStrategy Duy trì tham chiếu đến đối tượng Strategy Có thể định nghĩa một giao diện để Strategy truy cập dữ liệu của nó
5 Những tính chất đặc thù của mẫu
Một số điểm chính về việc thực thi của mẫu Strategy là:
Một vài lớp được thực thi chung với một giao diện
Code quyết định việc tạo ra một đối tượng từ những lớp nào
Lớp clients thuộc về đối tượng và thực hiện các tác vụ mà chương trình muốn làm
6 Những ưu khuyết điểm của mẫu
Ưu điểm:
Tập trung và hệ thống hoá các thuật toán có liên quan
Dễ dàng chuyển đổi và mở rộng: Ta có thể phối hợp nhiều kiểu
thuật toán bằng cách thừa kế trực tiếp từ Context và cho nó những sử
sự khác nhau Nhưng giải pháp này gắn chặt cách xử lý hiện tượng vào đối tượng Context, gây ra lẫn giữa cài đặt thuật toán và Context, gây khó khăn cho việc học, bảo dưỡng, mở rộng Context, và chúng ta không thể kết hợp các thuật toán một cách linh động Giải pháp này sẽ tạo ra rất nhiều lớp tương tự, chỉ khác nhau ở thuật toán hoặc cách xử
lý hiện tượng mà chúng thực hiện Bao bọc thuật toán bởi các lớp khác nhau cho ta kết hợp các thuật toán độc lập đối với môi trường sử dụng, đơn giản hoá việc hiểu, chọn và mở rộng từng thuật toán
Trang 7 Bỏ đi các câu lệnh điều kiện: Khi những cách xử lý khác nhau bị gói
vào một lớp, dùng câu lệnh điều kiện để chọn thao tách thích hợp rất khó khăn Ta có thể thay những câu lệnh này bằng cách bao bọc các thuật toán bởi các lớp khác nhau
Giao diện sử dụng đơn giản, tránh đưa ra những chi tiết không cần
thiết cho người sử dụng
Hạn Chế:
Khách hàng phải biết về các Strategy: nhược điểm hiển nhiên của
Strategy là khách hàng phải biết về các Strategy trước khi chọn cái thích hợp, như vậy khách hàng có thể bị "gò ép" theo những yêu cầu nảy sinh trong quá trình cài đặt cụ thể Chỉ nên dùng Strategy khi sự thay đổi về cách xử lý là rất quan trọng đối với khách hàng
Tăng số Object: Strategy làm tăng số đối tượng trong hệ thống( Bởi
vì mỗi thuật toán là 1 class thay vì các câu lệnh if else hoặc switch case) Ta có thể giảm bớt bằng cách làm những Strategy vô trạng thái (dữ liệu) để nhiều đối tượng dùng chung (share) Những trạng thái cần thiết sẽ được bảo dưỡng bởi môi trường và được chuyển cho trategy như các tham chiếu Strategy dùng chung không bảo dưỡng được trạng thái qua những lần được sử dụng
Vấn đề giao tiếp giữa Strategy và Context: Giao diện của Context
được công khai hoá cho tất cả Strategy cụ thể, dù thuật toán được thực hiện phức tạp hay đơn giản Rõ ràng là nhiều Strategy sẽ không dùng hết những thông tin có thể nhận được thông qua giao diện này, Strategy đơn giản thậm chí hoàn toàn không dùng giao diện Điều này
có nghĩa là Context có thể tạo ra và cho giá trị mặc định cả những tham chiếu mà nó không bao giờ được dùng đến
7 Lĩnh vực áp dụng và hệ quả
Hệ quả
Tập trung các thuật toán có liên quan lại với nhau
Trang 8 Giúp bỏ đi các câu lệnh điều kiện.
Một sự thay thế cho thừa kế
Có nhiều cách lựa chọn cài đặt
Trường hợp sử dụng
Nhiều class có liên quan với nhau chỉ khác nhau về hành vi Dựa vào Strategy Pattern, ta xây dựng được một class cấu hình với một trong các hành vi đó
Bạn cần biến thể khác nhau của 1 thuật toán
Thuật toán dùng dữ liệu mà khách hàng không nên biết tới Dùng Strategy để thay thế việc công khai hoá những cấu trúc dữ liệu phức tạp, đặc thù cho thuật toán
Một lớp định nghĩa nhiều cách xử lý khác nhau và những cách xử lý này có thể coi như câu lệnh chia nhánh (if- then- elsif, switch) trong phương thức Thay vì dùng cấu trúc điều kiện ta dùng các lớp Strategy cài đặt riêng từng nhánh
Trang 98 Các mẫu thiết kế có liên quan
Mẫu State
Mẫu State, có thể được xem như là một phiên bản động của mẫu Strategy Khi trạng thái bên trong một đối tượngthay đổi, nó có thể thay đổi hành vi của mình bằng cách chuyển sang một tập hợp các hoạt động khác
Có những điểm tương đồng đáng kể giữa các mẫu Strategy và State, nhưng sự khác biệt chính là một trong những dự định:
có thể chuyển trạng thái)
Mẫu Template Methods
Template Methods, như chúng ta đã thấy, rất hữu ích khi kết hợp với mẫu Strategy Trong C #, nó được sử dụng rộng rãi qua các giao diện được định nghĩa trước như IComparable
Mẫu Template Method giống mẫu Strategy ở chỗ nó dựa trên thuật toán Các bước của thuật toán được quy định trong Template Method
và một số được hoãn lại đến các lớp miền
So sánh các mẫu Strategy, State, và Template Method
Trang 119 Tài liệu tham khảo
Tài liệu TKPMHDT
http://nhatkyhoctap.blogspot.com/2012/07/strategy-pattern.html
https://qlammobi.blogspot.com/2017/04/huong-dan-strategy-pattern-voi-vi-du-don-gian.html