Christopher Alexander là người đầu tiên đưa ra khái niệm về mẫu thiết kế (design pattern) [2]. Ông định nghĩa về mẫu thiết kế như sau, “Mỗi mẫu
Hình 2.3: Minh họa biểu đồ tuần tự trong UML
thiết kế mô tả giải pháp để xử một vấn đề xảy ra một cách phổ biến trong môi trường thế giới thực. Bởi vậy, mẫu thiết kế cho phép các nhà phát triển phần mềm có thể sử dụng lại các giải pháp này cả triệu lần”. Như vậy, đối
với một tình huống phát sinh có tính chất thường xun (lặp đi lặp lại) trong q trình sử dụng phần mềm, các mẫu thiết kế cung cấp một khn mẫu chung để giải quyết nó. Nói cách khác, mẫu thiết kế cung cấp giải pháp cho các vấn đề thiết kế phổ biến thường gặp trong lập trình, cụ thể là các vấn đề về kế thừa và tương tác nói chung. Mẫu thiết kế khơng sử dụng để xử lý các vấn đề về kiến trúc tổng thể trong quy mơ lớn của tồn bộ mơ hình phần mềm.
Ưu điểm của các mẫu thiết kế là khả năng tái sử dụng, dễ mở rộng và bảo trì. Thực tế đã chứng minh, một phần mềm với một kiến trúc không
tốt, khi gặp vấn đề phát sinh, người phát triển sẽ phải dành nhiều thời gian, thậm chí là nhiều hơn cả thời gian bỏ ra xây dựng, chỉ là để sửa chữa chúng. Các mẫu thiết kế được trình bày một cách chi tiết và đầy đủ trong cuốn sách của bộ tứ GOF [28] và được phân loại thành ba nhóm chính, cụ thể là: (i) nhóm các mẫu khởi tạo (creational patterns), (ii) nhóm các mẫu cấu trúc (structural patterns) và (iii) nhóm các mẫu hành vi (behavioral patterns).
Nhóm mẫu đầu tiên, cung cấp cách thức để tạo ra một hoặc nhóm đối tượng. Các mẫu trong nhóm thứ hai dùng để thiết lập, định nghĩa quan hệ giữa các đối tượng. Nhóm mẫu cuối cùng xác định cách cư xử giao tiếp giữa các lớp và các đối tượng.
Nhóm các mẫu khởi tạo (creational patterns) bao gồm Factory, Abstract Factory, Singleton, Prototype, Builder. Các mẫu này giải quyết vấn đề tạo
lập các đối tượng sao cho phù hợp với mục đích của từng tình huống cụ thể. Kết quả của việc sử dụng các mẫu thuộc nhóm này là sự tách biệt hệ thống với các đối tượng (tạo lập, sáng tác, và biểu diễn đối tượng). Chúng làm tăng tính linh hoạt của hệ thống về những gì, ai, như thế nào, và khi nào các đối tượng được sáng tạo.
Các mẫu Adapter, Fa¸cade, Proxy, Composite, v.v. thuộc về nhóm mẫu
cấu trúc (structural patterns). Các mẫu này được sử dụng để kết hợp các lớp và các đối tượng đơn lẻ trở thành các lớp và đối tượng có cấu trúc.
Nhóm mẫu cuối cùng là nhóm các mẫu hành vi (behavioral patterns), bao gồm các mẫu Chain of responsibility, Command, Mediator, Strategy pattern, v.v. Các mẫu này này được sử dụng để xác định giao thức truyền
thông chung giữa các đối tượng bằng cách hiện thực hóa chúng. Sử dụng các mẫu trong nhóm hành vi làm tăng tính linh hoạt của hệ thống trong việc thực hiện giao tiếp giữa các lớp và đối tượng. Hình 2.4 mơ tả mẫu Strategy
và mối quan hệ của nó với một số mẫu thiết kế khác [67].
Hình 2.4: Một số mẫu thiết kế
Luận án sẽ trình bày chi tiết một mẫu trong nhóm hành vi, cụ thể là mẫu Strategy, mẫu này được áp dụng vào trong tiến trình tái cấu trong
chúng thành từng loại và có thể hốn đổi cho nhau”. Mẫu Strategy thực
thi các thuật toán một cách linh hoạt, tùy thuộc vào ngữ cảnh cụ thể. Ý nghĩa thực sự của Strategy là tách rời phần xử lý một chức năng ra khỏi đối tượng. Sau đó tạo ra một tập hợp các thuật toán để xử lý chức năng đó và cho phép lựa chọn thuật tốn đúng đắn nhất khi thực thi chương trình. Mẫu Strategy thường được sử dụng để thay thế cho sự kế thừa, khi muốn chấm dứt việc theo dõi và chỉnh sửa một chức năng qua nhiều lớp con.
Hình 2.5: Mẫu thiết kế StrategyMẫu Strategy bao gồm các thành phần sau: Mẫu Strategy bao gồm các thành phần sau:
– IStrategy: Giao diện (Interface) được chia sẻ giữa các lớp con cụ thể trong họ các thuật toán. Lớp Context sử dụng giao diện để gọi đến các thuật toán đã được định nghĩa trong các lớp con;
– ConcreteStrategy: Nơi các thuật toán được cài đặt cụ thể;
– Context: Lớp dùng để tham chiếu đến kiểu ISstrategy. Trong một số
trường hợp, Context có thể cài đặt các phương thức, bởi vậy các lớp
ConcreteStrategy có thể truy cập đến các dữ liệu này.
Sự hợp tác giữa các thành phần trong mẫu Strategy:
– IStrategy và Context tương tác để thực hiện việc lựa chọn các thuật tốn. Một Context có thể truyền tất cả các dữ liệu cần thiết bằng các thuật tốn đến IStrategy. Ngồi ra, Context có thể truyền chính nó như là một đối số cho các hoạt động của IStrategy. Điều đó cho phép IStrategy gọi lại Context khi cần thiết;
– MộtContext chuyển tiếp yêu cầu từ máy khách (client) đến cácIStra- tegy của nó. Máy khách thường tạo và truyền đối tượng ConcreteStra- tegy đến Context; sau đó, nó tương tác riêng với Context. Thường có
Ưu điểm của việc sử dụng mẫu Strategy là đóng gói các thuật tốn trong các lớp riêng biệt, điều này sẽ làm cho việc sử dụng lại mã được thuận tiện hơn nhiều và do đó, hành vi của lớp Context có thể thay đổi một cách linh hoạt tại thời điểm chạy chương trình.