1. Trang chủ
  2. » Luận Văn - Báo Cáo

thiết kế phần mềm hướng đối tượng strategy pattern

11 199 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 265,75 KB
File đính kèm tệp đính kèm.rar (8 MB)

Nội dung

 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 1

BỘ 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 2

1 Đặ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 3

interface), 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 5

2 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 9

8 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 11

9 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

Ngày đăng: 14/02/2019, 19:47

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w