Menu
CoddyTech

Giới thiệu về mẫu thiết kế

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 89 trên 110.

Mẫu thiết kế là những giải pháp đã được kiểm chứng cho các vấn đề phổ biến mà nhà phát triển thường gặp khi xây dựng phần mềm. Thay vì phải phát minh lại mọi thứ mỗi lần, bạn có thể áp dụng những khuôn mẫu đã được thiết lập này để giải quyết các thử thách tương tự một cách nhất quán và dễ bảo trì.

Hãy xem các mẫu thiết kế như những công thức nấu ăn. Cũng như đầu bếp không sáng tạo ra một cách làm bánh mì mới mỗi lần, lập trình viên sử dụng những mẫu đã được cải tiến qua nhiều thập kỷ. Những mẫu này tận dụng các khái niệm OOP bạn đã học, gồm lớp, kế thừa, interface và tính đa hình, rồi kết hợp chúng theo những cách cụ thể để giải quyết các vấn đề nhất định.

Các mẫu thiết kế thường được chia thành ba nhóm:

NhómMục đíchVí dụ
Khởi tạoCách tạo đối tượngSingleton, Factory
Cấu trúcCách kết hợp các đối tượngAdapter, Decorator
Hành viCách các đối tượng giao tiếpObserver, Strategy

Trong các bài học tiếp theo, bạn sẽ tìm hiểu những mẫu thiết kế cụ thể thuộc từng nhóm. Mỗi mẫu giải quyết một vấn đề riêng: đảm bảo chỉ có một đối tượng thuộc một lớp tồn tại, tạo đối tượng mà không chỉ định lớp cụ thể hoặc cho phép các đối tượng thông báo cho nhau khi có thay đổi. Hiểu khi nào và vì sao nên dùng từng mẫu cũng quan trọng như biết cách triển khai mẫu đó.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống giải quyết vấn đề đơn giản để minh họa cách các mẫu thiết kế tổ chức code theo danh mục! Bạn sẽ tạo một cấu trúc phân loại các thử thách phần mềm khác nhau và gợi ý loại mẫu nào có thể giúp giải quyết chúng.

Bạn sẽ tổ chức code vào hai tệp:

  • patterns.dart: Tạo một enum có tên PatternCategory với ba giá trị: creational, structural và behavioral. Mỗi giá trị cần có trường String description giải thích mục đích:
    • creational: "Handles object creation"
    • structural: "Handles object composition"
    • behavioral: "Handles object communication"
    Đồng thời, tạo một lớp có tên Problem để biểu diễn một thử thách phần mềm. Lớp này cần có trường String name và trường PatternCategory category. Thêm phương thức suggest() trả về một chuỗi theo định dạng: [name] -> Use a [category description] pattern
  • main.dart: Nhập tệp patterns của bạn và minh họa cách các vấn đề khác nhau tương ứng với các danh mục mẫu khác nhau. Tạo ba instance Problem:
    • Một vấn đề có tên Ensure single database connection với danh mục creational
    • Một vấn đề có tên Make old API work with new system với danh mục structural
    • Một vấn đề có tên Notify users when data changes với danh mục behavioral
    Gọi suggest() cho từng vấn đề và in ra kết quả.

Thử thách này giúp bạn hiểu cách phân loại các mẫu thiết kế dựa trên loại vấn đề mà chúng giải quyết. Đây là một khái niệm quan trọng khi bạn bắt đầu tìm hiểu các mẫu cụ thể trong những bài học sắp tới!

Đầu ra dự kiến:

Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication pattern

Tự làm thử

import 'patterns.dart';

void main() {
  // TODO: Tạo ba instance của Problem:
  // 1. name: "Ensure single database connection", category: creational
  // 2. name: "Make old API work with new system", category: structural
  // 3. name: "Notify users when data changes", category: behavioral

  // TODO: Gọi suggest() cho từng vấn đề và in ra kết quả
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online