Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 135 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
135
Dung lượng
2,73 MB
Nội dung
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA BỘ MƠN KHOA HỌC MÁY TÍNH LẬP TRÌNH NÂNG CAO(CO2039) BÀI TẬP LỚN Design Pattern Giáo viên hướng dẫn: Lớp: Sinh viên: Trương Tuấn Anh CN01 Nguyễn Minh Hiếu - 2153343 - Khoa Máy Tính TP HỒ CHÍ MINH, THÁNG 5/2023 n Mục lục SƠ 1.1 1.2 1.3 1.4 LƯỢC VỀ DESIGN PATTERNS Đặt vấn đề Design Pattern Nội dung tổng quan Mục đích báo cáo 2 2 2 KHÁI NIỆM VÀ PHÂN LOẠI 2.1 Khái niệm 2.2 Phân loại 2.3 Một số ví dụ 3 CÁC MẪU THIẾT KẾ 3.1 NHÓM KHỞI TẠO 3.1.1 Factory Method 3.1.2 Abstract Factory 3.1.3 Builder 3.1.4 Prototype 3.1.5 Singleton 3.2 NHÓM CẤU TRÚC 3.2.1 Adapter 3.2.2 Bridge 3.2.3 Composite 3.2.4 Decorator 3.2.5 Facade 3.2.6 Flyweight 3.2.7 Proxy 3.3 NHÓM HÀNH VI 3.3.1 Interpreter 3.3.2 Template of Method 3.3.3 Chain of Responsibility 3.3.4 Command 3.3.5 Iterator 3.3.6 Mediator 3.3.7 Memento 3.3.8 Observe 3.3.9 State 3.3.10 Strategy 3.3.11 Visitor Kết luận 6 13 21 31 37 41 41 47 52 57 62 67 72 77 77 82 87 92 98 102 107 112 117 122 127 133 n Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính SƠ LƯỢC VỀ DESIGN PATTERNS 1.1 Đặt vấn đề Trong lập trình hướng đối tượng (gọi tắt OOP) - vấn đề phát sinh thiết kế chương trình tùy vào nhu cầu tài nguyên cung cấp, lập trình viên cần đưa thiết kế tối ưu nhằm đáp ứng vấn đề đưa Tuy nhiên, lúc thiết kế đưa xác phát sinh việc tốn chi phí thời gian để liên tục sửa chữa tối ưu chương trình thiết kế Vậy có giải pháp cho vấn đề này? 1.2 Design Pattern Design Pattern - Mẫu thiết kế giải pháp tuyệt vời cho vấn đề Design Pattern chủ đề quan trọng lập trình hướng đối tượng (OOP) sử dụng rộng rãi việc xây dựng ứng dụng phức tạp Các mẫu thiết kế giải pháp đúc kết từ kinh nghiệm thực tế việc giải vấn đề lập trình phổ biến, giúp cải thiện tính bảo đảm, tái sử dụng mở rộng mã nguồn Lưu ý: Design Patterns khơng phải ngơn ngữ cụ thể Nó thực phần lớn ngơn ngữ lập trình, chẳng hạn Java, C#, chí Javascript hay ngơn ngữ lập trình khác 1.3 Nội dung tổng quan Bài báo cáo gồm chương: Chương báo cáo giới thiệu sơ lược vai trò mức độ cần thiết phải có Design Patterns, đồng thời tổng quát nội dung mục đích toàn báo cáo Chương giới thiệu khái niệm mẫu thiết kế số lượng mẫu thiết kế OOP Chúng ta sâu vào định nghĩa Mẫu Thiết kế, vai trò chúng lập trình hướng đối tượng, số ví dụ mẫu thiết kế phổ biến Chương phần chi tiết báo cáo, nơi cung cấp mô tả chi tiết TẤT CẢ mẫu thiết kế lập trình hướng đối tượng, bao gồm mẫu thiết kế cấu trúc, hành vi tạo đối tượng Chúng ta liệt kê mẫu thiết kế, mô tả cách chúng hoạt động, cung cấp ví dụ cụ thể cách áp dụng triển khai mẫu thiết kế, đánh giá ưu điểm, nhược điểm chúng Cuối cùng, chương phần kết luận, tóm tắt lại điểm bật quan trọng Mẫu Thiết kế lập trình hướng đối tượng 1.4 Mục đích báo cáo Mục đích báo cáo tìm hiểu Design Pattern lập trình hướng đối tượng (OOP) cung cấp cách tổng quan toàn diện mẫu thiết kế phổ biến OOP Báo cáo tập trung vào mục tiêu sau: • Giới thiệu khái niệm Mẫu Thiết kế: Báo cáo giúp độc giả hiểu rõ khái niệm Mẫu Thiết kế gì, chúng lại quan trọng lập trình hướng đối tượng, lợi ích việc sử dụng chúng • Tìm hiểu số lượng mẫu thiết kế OOP: Báo cáo giới thiệu đến độc giả mẫu thiết kế phổ biến OOP, bao gồm mẫu thiết kế cấu trúc, hành vi tạo đối tượng Chúng ta tìm hiểu mẫu thiết kế, cách chúng hoạt động cung cấp ví dụ cụ thể cách áp dụng chúng thực tế • Cung cấp mô tả chi tiết tất mẫu thiết kế OOP: Báo cáo cung cấp mô tả chi tiết mẫu thiết kế OOP, bao gồm cách chúng hoạt động, cách triển khai chúng, ví dụ cụ thể để minh họa cho cách sử dụng chúng Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 2/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính • Cung cấp ví dụ việc sử dụng mẫu thiết kế dự án thực tế: Báo cáo đưa ví dụ cụ thể việc sử dụng mẫu thiết kế dự án thực tế, giúp độc giả hiểu rõ ưu điểm, nhược điểm kết đạt từ việc áp dụng chúng thực tế • Đưa ví dụ mã nguồn thực tê để minh họa minh chứng cho mẫu thiết kế OOP báo cáo, giúp người đọc có nhìn chi tiết dễ hiểu mẫu thiết kế KHÁI NIỆM VÀ PHÂN LOẠI 2.1 Khái niệm Definition 2.1: Lý thuyết Thiết kế mẫu • Design patterns kỹ thuật lập trình hướng đối tượng (OOP) mà lập trình viên phải biết, khơng phải package hay thư viện cả, mà nhằm mục đích giải vấn đề chung, đưa hướng giải tối ưu • Có thể hiểu đơn giản mơ tả khn mẫu cho cách giải vấn đề áp dụng vào nhiều tình khác 2.2 Phân loại Năm 1994, nhóm bốn tác giả Erich Gamma, Richard Helm, Ralph Johnson John Vlissides cho xuất sách với tiêu đề Design Patterns – Elements of Reusable ObjectOriented Software, khởi nguồn khái niệm design pattern lập trình phần mềm Bốn tác giả biết đến rộng rãi tên Gang of Four (bộ tứ) Theo quan điểm bốn người, design pattern chủ yếu dựa theo quy tắc sau thiết kế hướng đối tượng • Lập trình cho interface khơng phải để implement interface • Ưu tiên object composition (chứa trong) inheritance (thừa kế) Hệ thống mẫu Design pattern có 23 mẫu định nghĩa “Design patterns Elements of Reusable Object Oriented Software” chia thành nhóm: • Creational Pattern (nhóm khởi tạo – mẫu) gồm: Factory Method, Abstract Factory, Builder, Prototype, Singleton Những Design pattern loại cung cấp giải pháp để tạo object che giấu logic việc tạo nó, thay tạo object cách trực tiếp cách sử dụng method new Điều giúp cho chương trình trở nên mềm dẻo việc định object cần tạo tình đưa • Structural Pattern (nhóm cấu trúc – mẫu) gồm: Adapter, Bridge, Composite, Decorator, Facade, Flyweight Proxy Những Design pattern loại liên quan tới class thành phần object Nó dùng để thiết lập, định nghĩa quan hệ đối tượng • Behavioral Pattern (nhóm tương tác/ hành vi – 11 mẫu) gồm: Interpreter, Template Method, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy Visitor Nhóm dùng thực hành vi đối tượng, giao tiếp object với Dưới bảng liệt kê mẫu thiết kê đề cập sơ đồ biểu thị mối quan hệ mẫu thiết kế: Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 3/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính Hình 1: Bảng phân loại mẫu thiết kế Hình 2: Sơ đồ mối quan hệ mẫu thiết kế Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 4/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính 2.3 Một số ví dụ Để hiểu thêm Thiết kế mẫu, ta khám phá số ví dụ ứng dụng phổ biến chúng Bằng cách xem xét ví dụ này, bạn hiểu sâu cách áp dụng mẫu thiết kế tình thực tế lợi ích mà chúng mang lại cho mã bạn • Vấn đề quản lý tổ chức: Bạn cần thiết kế hệ thống để phân cấp thứ bậc tổ chức hay cơng ty Thiết kế dùng để tính tốn tổng tiền lương cá nhân riêng lẻ hay phận tổ dùng để quản lý phân chia dự án đến nhân phận theo quy trình mà khơng có xung đột hay trùng lặp Ngoài ra, cần hủy bỏ hay nhiều phận, điều đồng nghĩa bậc nằm trong phận cần loại bỏ để tránh sai lệch thông tin Một cấu trúc chuyên quản lý thường hay áp dụng mẫu hợp tử - Composite Pattern Mẫu hợp tử ứng dụng đệ quy cấu trúc OOP để tạo quản lý chung cho hệ thống hay tổ chức Trong đó, phận hay cá nhân nút lá, phận lớn tập bao quát nút Như vậy, giả sử bạn muốn tìm tổng số tiền lương trả cho tất nhân viên tổ chức Sẽ lương CEO + lương trả cho tất phận Mức lương phận gì? Là lương trưởng phận + lương tất dự án Tổng tiền lương dự án bao nhiêu? Đó lương người quản lý dự án + lương tất thành viên dự án Tóm lại, lương thứ lương thân + lương tất nhóm phụ Nếu bạn muốn xóa nhánh (một phận) khỏi mẫu thiết kế sao? Dựa vào kĩ thuật đệ quy cấu trúc cây, mẫu cho xóa nút có phận cần xóa - ta không cần lo lắng có thơng tin sai lệch hay khơng • Vấn đề gửi thư: Bất bạn có thư, người đưa thư đến gõ cửa nhà bạn với thư Tuy nhiên, tưởng tượng bạn phải đến bưu điện ngày kiểm tra xem có thư khơng Đó hệ thống thực khơng hiệu cá nhân cần phải đến bưu điện định kỳ Điều loại bỏ sống thực cách giới thiệu chế gửi thư - người đưa thư mẫu quan sát viên - Observer pattern Với mẫu quan sát viên, đơn giản thay tự kiểm tra định kỳ, hệ thống bạn đăng ký (bưu điện) tự động gửi thông tin thay đổi đến với (nguoif gửi thư) Tuy nhiên, bạn cần cập nhật ln có trách nhiệm kiểm tra liệu xem chúng có liên quan đáng để bạn quan tâm hay không - điều tùy thuộc bạn Cơ chế tương tự chế thư điện tử, bạn xem thư gửi đến bạn tự động thông báo mà không cần kiểm tra định kỳ, song, việc bạn có đọc thư hay khơng phụ thuộc bạn • Vấn đề thiết kế cửa: Bạn cần mua cánh cửa để lắp đặt cho nhà bạn Tất nhiên, bạn khơng phải thợ mộc vấn đề khó khăn bạn cần trợ giúp từ người nghề để yêu cầu họ làm cho bạn cánh cửa mà bạn mong muốn.Bạn đưa kích thước cho cánh cửa yêu cầu bạn, anh xây dựng cánh cửa cho bạn Trong trường hợp này, người thợ mộc xưởng sản xuất cửa Thông số kỹ thuật bạn đầu vào cho nhà máy cánh cửa đầu sản phẩm từ nhà máy - ứng dụng phổ biến mẫu nhà máy - Factory Pattern Mẫu nhà máy cho phép bạn đưa yêu cầu đầu vào thiết kế theo mô tả định dạng bạn Dựa mẫu này, bạn xác định đầu vào liệu cân thiết để nhà máy hoạt động cho sản phẩm yêu cầu Như vậy, với số ví dụ đề cập, ta thấy việc hiểu ứng dụng thiết kế mẫu điều quan trọng lập trình viên Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 5/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính CÁC MẪU THIẾT KẾ Ở chương này, ta sâu vào nội dung cụ thể loại thiết kế mẫu đề cập chương KHÁI NIỆM VÀ PHÂN LOẠI 3.1 3.1.1 NHĨM KHỞI TẠO Factory Method Hình 3: Ảnh minh họa Định nghĩa: Factory Method Pattern - phương thức xuất xưởng design pattern lập trình hướng đối tượng thiết kế phần mềm, nhằm giải vấn đề tạo đối tượng mà không cần thiết class tạo Factory Method giải vấn đề cách định nghĩa phương thức cho việc tạo đối tượng, class thừa kế ghi đè để rõ đối tượng tạo Để dễ hình dung, ta sử dụng sơ đồ tổng quát đây: Hình 4: Sơ đồ cấu trúc Factory Method Mô tả chức thành phần sau: Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 6/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính Các thành phần chính: • Creator: Là lớp abstract interface chứa phương thức Factory Method, phương thức lớp kế thừa thực để tạo đối tượng cụ thể • Concrete Creator: Là lớp Creator, thực việc tạo đối tượng cụ thể • Product: Là lớp abstract interface mơ tả đối tượng tạo • Concrete Product: Là lớp Product, chứa thông tin cụ thể đối tượng Tiếp theo, ta mô tả trình hoạt động Factory Method: Quá trình tạo đối tượng diễn sau: • Client gọi phương thức Factory Method Creator, không quan tâm đối tượng cụ thể tạo • Creator gọi phương thức tạo đối tượng, nhiên, phương thức không triển khai Creator mà triển khai lớp Creator • Các lớp Creator triển khai phương thức tạo đối tượng, trả đối tượng cụ thể Concrete Product • Creator nhận lại đối tượng cụ thể trả cho Client Để hiểu mẫu thiết kế này, đưa ví dụ cụ thể sau: • Vấn đề: Tưởng tượng bạn lập trình viên nhiệm vụ bạn tạo phần mềm quản lý hậu cần Phiên ứng dụng bạn xử lý việc vận chuyển xe tải, phần lớn mã bạn nằm lớp Truck Sau thời gian, ứng dụng bạn trở nên phổ biến Mỗi ngày, bạn nhận hàng chục yêu cầu từ công ty vận tải biển để kết hợp dịch vụ hậu cần đường biển vào ứng dụng Đó tin tốt ý nghĩa kinh tế, tức ứng dụng bạn tin dùng có nhu cầu cao Tuy nhiên, mã lệnh ứng dụng khơng phải tin vui Hiện tại, mã lệnh bạn dừng việc sử dụng lớp Truck Việc kết hợp dịch vụ hậu cần biển yêu cầu ứng dụng bạn cần xây dựng thêm lớp Ship Điều có nghĩa bạn cần phải thay đổi lại toàn mã lệnh vốn có vận hành lớp Truck Tình lặp lại ứng dụng bạn lại cần tiếp tục cập nhật nâng cấp cho dịch vụ hậu cần có tương lai Theo hướng thơng thường, bạn sửa lại toàn mã lệnh, điều gây tiêu tốn thời gian công sức nhiều cần xem xét lại thêm bớt tất điều kiện có loại dịch vụ vận chuyển • Giải pháp: Bằng việc sử dụng Factory Method Pattern để giải vấn đề này, mẫu thiết kế cho ta gợi ý bạn nên thay lệnh gọi xây dựng đối tượng trực tiếp (sử dụng toán tử new) lệnh gọi đến phương thức xuất xưởng đặc biệt Tất nhiên, đối tượng tạo thơng qua tốn tử new, gọi từ bên phương thức xuất xưởng Các đối tượng trả phương thức xuất xưởng thường gọi sản phẩm Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 7/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính Hình 5: Ảnh minh họa Thoạt nhìn, thay đổi vơ nghĩa: vừa chuyển lệnh gọi hàm tạo từ phần sang phần khác chương trình Tuy nhiên, xem xét điều này: bạn ghi đè phương thức xuất xưởng lớp thay đổi loại sản phẩm tạo phương thức Tuy nhiên, có hạn chế nhỏ: lớp trả loại sản phẩm khác sản phẩm có lớp sở giao diện chung Ngoài ra, phương thức xuất xưởng lớp sở phải có kiểu trả khai báo giao diện Hình 6: Ảnh minh họa Ví dụ, hai lớp Truck Ship lớp nên triển khai giao diện Transport, giao diện khai báo phương thức có tên deliver Mỗi lớp thực phương pháp khác nhau: xe tải giao hàng đường bộ, tàu giao hàng đường biển Phương thức xuất xưởng lớp RoadLogistics trả đối tượng xe tải, phương thức xuất xưởng lớp SeaLogistics trả tàu Hình 7: Ảnh minh họa Mã sử dụng phương thức xuất xưởng (thường gọi mã máy khách ) không thấy khác biệt sản phẩm thực tế trả lớp khác Khách hàng coi tất sản phẩm abstract Transport Máy khách biết tất đối tượng vận chuyển phải có Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 8/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính phương thức deliver, xác cách thức hoạt động khơng quan trọng máy khách • Thực thi đơn giản: Phía ví dụ liên quan thực tế, vậy, để đơn giản hóa phương thức, ta xem xét thực hành toán sau: Hãy tạo giao diện Shape lớp cụ thể triển khai giao diện Shape Một lớp nhà máy ShapeFactory định nghĩa bước FactoryPatternDemo, lớp demo sử dụng ShapeFactory để lấy đối tượng Shape Nó chuyển thơng tin (CIRCLE/RECTANGLE/SQUARE) tới ShapeFactory để lấy loại đối tượng mà cần Hình 8: Ảnh minh họa giao diện Shape Giải vấn đề: Bước 1: Tạo giao diện Shape # include < iostream > class Shape { public : virtual void draw () = 0; }; Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 9/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính 11 }; Bước 2: Tạo lớp Context 10 11 12 13 14 15 16 17 18 // Step 2: Create Context Class class Context { private : State * state ; public : Context () { state = nullptr ; } void setState ( State * state ) { this - > state = state ; } State * getState () { return state ; } }; Bước 3: Tạo lớp cụ thể thực giao diện 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // Step 3: Create concrete classes implementing the same interface class StartState : public State { public : void doAction ( Context * context ) override { cout toString () doAction ( context ) ; cout getState () -> toString () using namespace std ; // Step 1: Create an interface class Strategy { public : virtual int doOperation ( int num1 , int num2 ) = 0; }; Bước 2: Tạo lớp cụ thể thực giao diện 10 11 12 13 14 15 16 17 18 19 20 21 // Step 2: Create concrete classes implementing the same interface class OperationAdd : public Strategy { public : int doOperation ( int num1 , int num2 ) override { return num1 + num2 ; } }; class Ope ti onS ub st rac t : public Strategy { public : int doOperation ( int num1 , int num2 ) override { return num1 - num2 ; } }; class Op erationM ultiply : public Strategy { public : int doOperation ( int num1 , int num2 ) override { return num1 * num2 ; } }; Bài tập lớn Lập trình nâng cao - Năm học 2023 − 2024 n Page 124/134 Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học Kỹ thuật Máy Tính Bước 3: Tạo lớp Context 10 11 12 13 14 // Step 3: Create Context Class class Context { private : Strategy * strategy ; public : Context ( Strategy * strategy ) { this - > strategy = strategy ; } int executeStrategy ( int num1 , int num2 ) { return strategy - > doOperation ( num1 , num2 ) ; } }; Bước 4: Sử dụng Context để xem xét thay đổi Strategy 10 11 12 13 // Step 4: Use the Context to see change in behaviour when it changes its Strategy int main () { Context context ( new OperationAdd () ) ; cout