CHƯƠNG 2. GIỚI THIỆU VỀ CÔNG CỤ KIỂM THỬ TỰ ĐỘNG VÀ MÔ HÌNH
2.3. Giới thiệu mẫu thiết kế (Design pattern)
2.3.1. Khái niệm
Định nghĩa của Christopher Alexander:
“Mỗi mẫu mô tả một vấn đề xảy ra lặp đi lặp lại, và trình bày trọng tâm của giải pháp cho vấn đề đó, theo cách mà bạn có thể dùng đi dùng lại hàng triệu lần mà không cần phải suy nghĩ.”
Phân tích và thiết kế là những việc đầu tiên cần phải làm khi bắt tay vào sản xuất phần mềm. Một thiết kế tốt sẽ giúp chúng ta tránh phải chỉnh sửa nhiều lần. Một người thiết kế hướng đối tượng có kinh nghiệm thường cho rằng rất khó để cho ra một thiết kế chuẩn ngay từ lần đầu, mà nó thường phải trải qua nhiều lần tái sử dụng và chỉnh sửa sau mỗi lần. Nếu nhớ được chi tiết về vấn đề trước đây và cách giải quyết nó, chúng ta có thể tái sử dụng thay vì phải sáng tạo lại. Nhưng giả sử chúng ta không nhớ rõ thì bắt buộc phải tìm lại tài liệu, tìm giải pháp mới,... Đó chính là lý do design pattern ra đời, nhiệm vụ của nó chỉ đơn giản là cô đọng lại giải pháp hiệu quả để giải quyết một vấn đề cụ thể thành một mẫu thiết kế có thể tái sử dụng.
Về giới thiệu chung, một mẫu có 4 thành phần chính:
Tên: được dùng để mô tả vấn đề thiết kế, giải pháp, và kết quả trong từ 1 đến 2 chữ.
Vấn đề mà mẫu này được áp dụng.
Giải pháp: mô tả những thành phần tạo nên thiết kế, mối quan hệ, trách nhiệm và cộng tác giữa các thành phần đó
Cuối cùng là hệ quả, là lợi ích cũng như hạn chế khi sử dụng mẫu. Mặc dù những điều này không được nhắc đến khi chúng ta ra quyết định thiết kế, nhưng rõ ràng việc đánh giá và hiểu được chi phí cũng như lợi ích khi áp dụng mẫu là cần thiết.
2.3.2. Phân loại mẫu thiết kế (Design Pattern)
Mẫu thiết kế được chia thành 3 loại, bao gồm: Mẫu thiết kế kiến tạo (creational pattern), mẫu thiết kế kiến trúc (structural pattern) và mẫu thiết kế hành vi (behavioral pattern)
Mẫu thiết kế kiến tạo (Creational Patterns)
Những mẫu thuộc nhóm này trừu tượng hóa quá trình khởi tạo. Chúng giúp việc tạo và trình diễn đối tượng độc lập với hệ thống. Nhóm này bao gồm 5 mẫu thiết kế, cụ thể là:
Bảng 2.7. 5 mẫu thiết kế trong mẫu thiết kế kiến tạo
Tên Mục đích
Abstract Factory
Cung cấp một giao diện cho việc tạo lập các đối tượng mà không cần xác định lớp cụ thể tạo mỗi đối tượng
Builder Tách rời việc xây dựng một đối tượng phức tạp khỏi biểu diễn của nó sao cho cùng một tiến trình xây dựng có thể tạo được các biểu diễn khác nhau.
Factory Method
Định nghĩa giao diện để sinh ra đối tượng nhưng để cho lớp con quyết định lớp nào được dùng để sinh ra đối tượng
Prototype Qui định loại của các đối tượng cần tạo bằng cách dùng một đối tượng mẫu, tạo mới nhờ vào sao chép đối tượng mẫu này.
Singleton Đảm bảo 1 lớp chỉ có 1 instance và cung cấp 1 điểm truy xuất toàn cục đến nó
Mẫu thiết kế kiến trúc (Structural Patterns)
Những pattern thuộc nhóm này liên quan đến việc thiết lập và định nghĩa quan hệ giữa các đối tượng. Bao gồm:
Bảng 2.8. Những mẫu thiết kế thuộc nhóm mẫu thiết kế kiến trúc
Tên Mục đích
Adapter Chuyển giao diện của một lớp thành giao diện phù hợp yêu cầu
Tên Mục đích
Bridge Tách rời ngữ nghĩa của một vấn đề khỏi việc cài đặt
Composite Tổ chức các đối tượng theo cấu trúc phân cấp dạng cây, các đối tượng trong cấu trúc được thao tác theo một cách thuần nhất như nhau.
Decorator Gán thêm trách nhiệm cho đối tượng vào lúc chạy (thêm chức năng cho class).
Facade Cung cấp một interface cấp cao, dễ dùng cho một tập hợp các interface của hệ thống con (subsystem)
Flyweight Chia sẻ trạng thái chung nhằm thao tác hiệu quả tài nguyên và bộ nhớ Proxy Cung cấp đối tượng đại diện cho một đối tượng khác để hỗ trợ hoặc kiểm
soát quá trình truy xuất đến đối tượng đó
Mẫu thiết kế hành vi (Behavioral Patterns)
Nhóm này liên quan đến việc thực hiện các hành vi của đối tượng. Bao gồm:
Bảng 2.9. Những mẫu thiết kế thuộc nhóm mẫu thiết kế hành vi
Tên Mục đích
Chain of
Responsibility
cho phép truyền request thông qua một chuỗi đối tượng nhận request
Command mỗi request hoặc command được đóng gói và gửi đi như một đối tượng
Interpreter Hỗ trợ việc định nghĩa biểu diễn văn phạm và bộ thông dịch cho một ngôn ngữ
Iterator Truy xuất các element của đối tượng dạng tập hợp tuần tự (list, array, …)
Mediator Định nghĩa một đối tượng để điều hướng việc giao tiếp giữa một số đối tượng với nhau.
Memento chỉnh sửa và phục hồi trạng thái bên trong của đối tượng mà vẫn không vi phạm việc đóng gói dữ liệu
Tên Mục đích
Observer Định nghĩa sự phụ thuộc một-nhiều giữa các đối tượng sao cho khi một đối tượng thay đổi trạng thái thì tất cả các đối tượng phụ thuộc nó cũng thay đổi theo.
State Cho phép một đối tượng thay đổi hành vi khi trạng thái bên trong của nó thay đổi
Strategy đóng gọi các thuật toán bằng các lớp, mỗi thuật toán có thể thay đổi độc lập đối với chương trình sử dụng thuật toán. 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.
Template Method
Định nghĩa phần khung của một thuật toán, tức là một thuật toán tổng quát gọi đến một số phương thức chưa được cài đặt trong lớp cơ sở; việc cài đặt các phương thức được ủy nhiệm cho các lớp kế thừa.
Visitor Cho phép định nghĩa thêm phép toán mới tác động lên các element của một cấu trúc đối tượng mà không cần thay đổi các lớp định nghĩa cấu trúc đó.