Giới thiệu Design patterns TEMPLATE METHOD

10 1.2K 3
Giới thiệu Design patterns  TEMPLATE METHOD

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

Thông tin tài liệu

giới thiệu sơ bộ và tìm hiểu về mẫu thiết kế Design patterns và mẫu thiết kế TEMPLATE MEDTHOD. Các thuật toán ví dụ đơn giản để có thể thao tác với mẫu thiết kế và sử dụng chúng một các sơ bộ. Các mẫu thiết kế có nguồn gốc từ những công bố về những cấu trúc thiết kế nhất địnhcủa Christopher Alexander một kỹ sư, người đã viết về kinh nghiệm của mình trongviệc giải quyết các vấn đề thiết kế khi liên quan đến các tòa nhà và thị trấn.Sau đó, các chuyên gia phần mềm đã bắt đầu kết hợp các nguyên tắc của Alexandervào việc tạo ra các tài liệu hướng dẫn mô hình thiết kế ban đầu như một hướng dẫn đểcác nhà phát triển mới làm quen. Những mô hình này dựa trên kinh nghiệm làm việc lâu năm của các chuyên gia thiết kế, họ nghiên cứu và tổng quát hóa cách giải quyết cho vấn đề thường xuyên gặp phải quá trình làm việc.

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN MÔN PHƯƠNG PHÁP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG BÁO CÁO TÌM HIỂU ĐỀ TÀI 6: MẪU THIẾT KẾ HƯỚNG ĐỐI TƯỢNG TEMPLATE METHOD Giảng viên hướng dẫn: Thạc sĩ Nguyễn Minh Huy Thạc sĩ Đặng Hoàng Hải Nhóm 10: 1312194 - Trần Chí Hiếu 1312275 - Lê Đức I Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 1 MỤC LỤC I. TÌM HIỂU DESIGN PATTERNS 2 1. DESIGN PATTERNS (MẪU THIẾT KẾ) LÀ GÌ? 2 2. SỰ RA ĐỜI CỦA DESIGN PATTERNS? 2 3. TẠI SAO CẦN ĐẾN DESIGN PATTERNS? 3 4. CẤU TRÚC CỦA MỘT MẪU THIẾT KẾ 4 5. PHÂN LOẠI DESIGN PATTERNS: 4 II. MẪU THIẾT KẾ TEMPLATE MEDTHOD 6 1. DẪN NHẬP 6 2. TÌM HIỂU TEMPLATE METHOD 8 a. Định nghĩa 8 b. Cấu trúc: 8 c. Sử dụng 9 d. Bài tập 9 III. TÀI LIỆU THAM KHẢO: 9 Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 2 I. Tìm hiểu Design Patterns. 1. Design patterns (Mẫu thiết kế) là gì? Trong toán học, ta thường gặp tình huống như sau: Tìm x, biết: a. 3x = 6; b. 2x + 5 = 10; Trong quá trình giải các bài toán trên, các nhà toán học nhận thấy: các bài toán này có yêu cầu giống nhau và cách giải tương tự nhau. Từ đó, các nhà toán học đã nghiên cứu để tổng quát hóa vấn đề và phương pháp giải để sau này khi gặp các trường hợp như trên thì áp dụng phương pháp này. Vậy trong thiết kế hướng đối tượng như trong toán học hay không? Chúng được tạo ra như thế nào? Và có tầm ảnh hưởng như thế nào? Trong thiết kế hướng đối tượng cũng có các mẫu như vậy, chúng được gọi là mẫu thiết kế (Design patterns). Design patterns là các giải pháp đã được tối ưu hóa, được tái sử dụng để giải quyết các vấn đề chung, thường gặp trong lập trình. Ví du: Bạn được yêu cầu thiết kế một game chiến thuật, sao cho bạn chỉ có thể mua và điều khiển duy nhất 1 vị tướng? Bạn giải quyết như thế nào? Trong đề kiểm tra giữa kì thực hành hướng đối tượng, có yêu cầu mỗi ứng dụng chỉ có duy nhất một buffer, bạn phải làm như thế nào để đảm bảo yêu cầu này. Trong quá trình làm việc và nghiên cứu, các chuyên gia thiết kế đã tổng quát hóa cách giải quyết cho yêu cầu đảm bảo class chỉ có một đối tượng duy nhất thành mẫu thiết kế Singleton. Khi gặp các trường hợp tương tự có thể sử dụng lại ý tưởng của mẫu Singleton thì có thể giải quyết được vấn đề. Design patterns là một khuôn mẫu đã được thực hiện trong tình huống chính xác. Nó không phải là ngôn ngữ cụ thể nào cả. Một design patterns có thể thực hiện được ở phần lớn các ngôn ngữ lập trình (không phải là tất cả). 2. Sự ra đời của Design patterns? Các mẫu thiết kế có nguồn gốc từ những công bố về những cấu trúc thiết kế nhất định của Christopher Alexander - một kỹ sư, người đã viết về kinh nghiệm của mình trong việc giải quyết các vấn đề thiết kế khi liên quan đến các tòa nhà và thị trấn. Sau đó, các chuyên gia phần mềm đã bắt đầu kết hợp các nguyên tắc của Alexander vào việc tạo ra các tài liệu hướng dẫn mô hình thiết kế ban đầu như một hướng dẫn để các nhà phát triển mới làm quen. Những mô hình này dựa trên kinh nghiệm làm việc lâu Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 3 năm của các chuyên gia thiết kế, họ nghiên cứu và tổng quát hóa cách giải quyết cho vấn đề thường xuyên gặp phải quá trình làm việc. Năm 1995, Eric Gamma, Richard Helm, Ralph Johnson và John Vlissides đã công bố cuốn sách “Elements of reusable Object Oriented Software” và đã đánh dấu sự ra đời của thiết kế mẫu. Cuốn sách này được coi là sự "xuất hiện" của các mẫu thiết kế cho cộng đồng phần mềm rộng lớn và có ảnh hưởng lớn trong sự phát triển của các mẫu thiết kế kể từ đó. Các mẫu thiết kế được mô tả 23 mẫu được dựa trên kinh nghiệm của các tác giả tại thời điểm đó. Những mô hình đã được lựa chọn, đại diện cho các giải pháp cho các vấn đề phổ biến trong phát triển phần mềm. Nhiều mô hình khác đã được ghi nhận và xếp vào mục lục kể từ khi xuất bản các mẫu thiết kế. Tuy nhiên, 23 mẫu này phổ biến và nổi tiếng nhất, và điều quan trọng hơn là từ 23 này có kết hợp với nhau một cách hài hòa, sáng tạo thì có thể giải quyết phần lớn vấn đề gặp phải. 3. Tại sao cần đến Design patterns? Những lợi ích đem lại từ việc sử dụng các mẫu thiết kế sẽ đưa cho chúng ta câu trả lời về việc tại sao cần đến Design patterns. • Design patterns cung cấp cách để giải quyết các vấn đề liên quan đến phát triển phần mềm sử dụng một giải pháp đã được chứng minh. Các giải pháp tạo điều kiện cho sự phát triển của các mô-đun có liên kết chặt chẽ với các khớp nối tối thiểu. Chúng cô lập các thay đổi có thể tồn tại trong các yêu cầu hệ thống, làm cho toàn bộ hệ thống dễ dàng hơn để hiểu và duy trì. • Trong quá trình thiết kế Design Pattern, các chuyên gia đã xây dựng nên các hệ thống từ vựng, thuật ngữ hỗ trợ cho công việc của mình. Hệ thống thuật ngữ này giúp cho việc viết, đọc, hiểu trở nên dễ dàng hơn. Các nhà thiết kế có thể trao đổi, diễn đạt một cách dễ dàng các mẫu thiết kế của mình, và người đọc (nghe) có thể hình dung được vấn đề và cách giải quyết. Ví dụ: “Singleton” là tên của một mẫu thiết kế, khi nhắc đến thuật ngữ này, các nhà thiết kế hình dung ngay ra vấn đề cần giải quyết có liên quan đến việc tạo lập đối tượng, đảm bảo chỉ có một instance duy nhất trong class tạo lập,… Như vậy, khi các nhà thiết kế cùng có kiến thức về mẫu thiết kế nào đó thì việc trao đổi, nắm bắt kiến trúc hệ thống diễn ra nhanh hơn, tiết kiệm được rất nhiều thời gian. • Design patterns hỗ trợ tái sử dụng kiến trúc và mô hình thiết kế phần mềm theo quy mô lớn. Design pattern được vận dụng ở mức tổng quát hơn, giúp các nhà phát triển hình dung và ghi nhận các cấu trúc tĩnh và động cũng như quan hệ tương tác giữa các giải pháp trong quá trình thiết kế ứng dụng đối với một chuyên khu riêng biệt. Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 4 4. Cấu trúc của một mẫu thiết kế Một mẫu thiết kế thường kế 4 thành phần cơ bản:  Pattern Name Gồm một hoặc hai từ, đặt tên ngắn gọn và xúc tích cho vấn đề, cách xử lý và kết quả. Đặt tên mẫu một cách chính xác giúp cho hệ thống thuật ngữ về thiết kế tăng lên nhanh chóng. Hệ thống thuật ngữ này giúp các nhà thiết kế có thể diễn đạt vấn đề và hình dung cách giải quyết một cách dễ dàng.  Problem Thông thường phần này mô tả các các vấn đề thiết kế cụ thể và trường hợp xuất hiện của chúng. Từ đó biết được điều kiện và phạm vi áp dụng của mẫu thiết kế.  Solution Phần này mô tả các yếu tố tạo nên mẫu thiết kế, vai trò, mối quan hệ cũng như sự tương tác giữa các yếu tố đó. Phần này không mô tả thiết kế và cách cài đặt một cách chi tiết, thay vào đó, diễn tả một cách trừu tượng và tổng quát hóa vấn đề và cách tổ chức của các yếu tố để giải quyết vấn đề.  Consequences Phần này đề cập tới kết quả và những vấn đề liên quan (không gian và thời gian) khi áp dụng các mẫu thiết kế. Thỉnh thoảng phần này thường không có mặt trong phần mô tả cách giải quyết, tuy nhiên, nhưng nó khá quan trọng để đánh giá được lợi ích và chi phí khi mẫu thiết kế được áp dụng. 5. Phân loại Design patterns: Design Pattern được phân loại theo hai tiêu chí: - Tiêu chí thứ nhất: Mục đích (Purpose – what pattern does). Các Design Pattern được chia thành 3 nhóm, gồm Creational Pattern (nhóm khởi tạo) : Liên quan đến quá trình khởi tạo đối tượng cụ thể từ một định nghĩa trừu tượng (abstract class, interface). Creational cung cấp cơ chế instantiation, làm cho nó dễ dàng hơn để tạo các object trong một cách phù hợp với tình huống, nhóm Creational Pattern sẽ sử dụng một số thủ thuật để che dấu đi phần khởi tạo đối tượng. Structural Pattern (nhóm cấu trúc tĩnh): Quan tâm đến các vấn đề kết hợp giữa objects và classes để tạo một cấu trúc lớn hơn. Có thể chia chúng thành 2 loại: Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 5 + Structural class pattern: Sử dụng tính kế thừa để tạo các giao diện (interfaces) hay các cách cài đặt (implementations): ví dụ, ta thừa kế trộn 2 hay nhiều lớp thành một lớp mới. Lớp tạo ra chứa tất cả các thuộc tính của các lớp cơ sở của nó. + Structural object pattern: là phương pháp để hợp các đối tượng để thực hiện chức năng mới. Behavioral Pattern gồm : Quan tâm với các thuật toán và phân chia trách nhiệm giữa các đối tượng. Mô tả cách thức để các lớp hoặc đối tượng có thể giao tiếp với nhau. - Tiêu chí thứ hai: Phạm vi (Scope – When pattern applies to). Các Design Pattern được chia làm 2 nhóm, gồm Class scope: Giải quyết các quan hệ, vấn đề giữa các lớp (classes) và các lớp con (subclasses) của nó. Mối quan hệ này được thiết lập thông qua tính kế thừa, nên chúng được gắn kết tĩnh tại thời gian biên dịch (statically defined at run-time). Object scope: Giải quyết mối quan hệ giữa các đối tượng (objects), mà có thể được thay đổi tại thời gian chạy (manipulated at runtime) và chúng linh động hơn. Bảng phân loại 23 mẫu thiết kế Gang Of Four Creational Structural Behavioral Class Scope Factory Method Adaptor - class Template Method Interpreter Object Scope Abstract Factory Adaptor- object Chain of responsibility Builder Brigde Command Prototype Facade Mediator Singleton Decorator Iterator Flyweight Memento Proxy Observer Composite State Strategy Visitor Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 6 II. Mẫu thiết kế Template Medthod 1. Dẫn nhập: Cho các yêu cầu sau: a. Sắp xếp mảng số nguyên n phần tử theo thứ tự tăng dần b. Sắp xếp mảng số nguyên n phần tử theo thứ tự giảm dần Cài đặt (các) class sort giải quyết các yêu cầu. Code: class SortUp { public: void sort(int a[], int n) { for(int i = 0; i < n; i++) for(int j = i; j < n; j++) if(a[i] > a[j]) Swap(a[i], a[j]); } private: void Swap(int &a, int &b) { int t = a; a = b; b = t; } }; class SortDown { public: void sort(int a[], int n) { for(int i = 0; i < n; i++) for(int j = i; j < n; j++) if(a[i] < a[j]) Swap(a[i], a[j]); } private: void Swap(int &a, int &b) { int t = a; a = b; b = t; } Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 7 }; Ta nhận thấy rằng hai hàm sortUp và sortDown có cấu trúc tương tự nhau và chỉ khác nhau ở điều kiện so sánh. Chúng ta có ý tưởng sau: tổ chức điều kiện so sánh thành hàm isSwap, tạo lớp AbstractSort cơ sở có cấu trúc chung cho sortUp và sortDown, sau đó cho sortUp và sortDown kế thừa lớp sort và định nghĩa lại hàm bool isSwap(int, int). class AbstractSort { public: void sort(int a[], int n) { for (int i = 0; i < n; i++) for (int j = i; j < n; j++) if (isSwap(a[i], a[j])) Swap(a[i], a[j]); } private: virtual bool isSwap(int, int) = 0; void Swap(int &a, int &b) { int t = a; a = b; b = t; } }; class SortUp : public AbstractSort { bool isSwap(int a, int b){ return (a > b); } }; class SortDown : public AbstractSort { bool isSwap(int a, int b) { return (a < b); } }; Trong tình huống trên, chúng ta đã tạo bộ khung chung cho thuật toán sort và để bước so sánh cho lớp con cài đặt, lớp cơ sở có nhiệm vụ khai báo khuôn dạng cho hàm (phương thức) so sánh này. Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 8 Thực tế trong lập trình có rất nhiều trường hợp tương tự như trường hợp trên, chúng ta có một bộ khung chung và giao một số bước nhất định cho lớp con định nghĩa lại theo yêu cầu cụ thể nào đó. Các chuyên gia thiết kế đã nghiên cứu và tổng quát hóa vấn đề trên thành mẫu Template Method. 2. Tìm hiểu Template Method a. Định nghĩa: Template method tạo bộ khung của một thuật toán bằng các thao tác, trong đó có một số bước dành cho các lớp con thực hiện. Các lớp con định nghĩa lại các bước này để phù hợp với yêu cầu cụ thể mà không làm thay đổi cấu trúc của thuật toán. b. Cấu trúc:  AbstractClass Định nghĩa các abstract primitive operation (gồm giá trị trả về, tên phương thức), các thao tác này được định nghĩa lại ở các lớp con cụ thể để thực hiện các bước của một giải thuật. Cài đặt một template method định nghĩa bộ khung của thuật toán. Template method này gọi các primitive operation như các phương thức được định nghĩa trong AbstractClass (hoặc một số đối tượng khác).  ConcreteClass Thực hiện primitive operation nhưng cài đặt lại nội dung phù hợp với mỗi class riêng và cũng thực hiện các bước đã chỉ ra trong template method. Khoa Công Nghệ Thông Tin 1312194 - 1312275 Page 9 c. Sử dụng Template method nên sử dụng trong các trường hợp sau:  Cài đặt các phần cố định của một thuật toán và để lại các phương thước có thể thay đổi theo yêu cầu của vấn đề cho lớp con cài đặt.  Tránh sự trùng lắp mã nguồn: các đoạn mã chung trong các lớp con có thể được tách ra và đưa vào trong phần cài đặt của lớp cơ sở.  Kiểm soát phần mở rộng của các lớp con. Ta có thể định nghĩa một template method, mẫu này gọi các hook operation (hook operation cung cấp các thao tác mặc định mà các lớp con có thể mở rộng nếu cần thiết. Thông thường một hook operation mặc định không làm gì cả) tại các điểm đặc biệt, bằng cách đó cho phép các mở rộng chỉ xảy ra tại các điểm đó. d. Bài tập Xây dựng các class Prim tìm cây khung nhỏ nhất cho các cách tổ chức dữ liệu đồ thị khác nhau (ma trận kề, danh sách kề). III. Tài liệu tham khảo:  Design Patterns: Elements of Reusable Object-Oriented Software, tác giả: E. Gamma, R. Helm, R. Johnson, and J. Vlissides.  Lý Thuyết Đồ Thị, tác giả: Trần Đan Thư, Dương Anh Đức.

Ngày đăng: 25/11/2014, 22:42

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan