Strategy_pattern
Các lớp tham gia(Participants) Strategy (Compositor)- Định nghĩa giao diện chung cho các thuật toán được cài đặt. Context dùng giao diện này để gọi những thuật toán được thực hiện trong những ConcreteStrategy (Strategey cụ thể) ConcreteStrategy (SimpleCompositor, TeXCompositor, ArrayCompositor) - Cài đặt các thuật toán sử dụng giao diện Strategy Context (môi trường)- (Composition) - Được hiệu chỉnh bằng 1 đối tượng Strategy -Bảo dưỡng tham chiếu tới đối tượng Strategy - Có thể định nghĩa giao diện cho Strategy dùng được dữ liệu của nó Phối hợp(Colaboration) - Strategy và Context trao đổi thông tin để thực hiện thuật toán. Context có thể chuyển cho Strategy tất cả dữ liệu khi thuật toán được gọi. Giải pháp khác là Context chuyển chính nó cho Strategy như một hàm số. Strategy gọi lại những phương thức được định nghĩa trong giao diện của Context để hỏi dữ liệu. - Context chuyển lời gọi phương thức từ khách hàng của nó cho Strategy. Khách hàng thường tạo ra và chuyển cho Context một ConcreteStrategy, sau đó khách hàng chỉ trao đổi thông tin với Context. Thông thường khách hàng có thể lựa chọn ConcreteStrategy từ 1 tập hợp thuật toán cho trước. Kết quả(Consequences) Strategy có những ưu khuyết điểm sau: Tập trung và hệ thống hóa những thuât toán có liên quan. Hệ thống thừa kế của các lớp Strategy định nghĩa một gia đình của các thuật toán hoặc cách xử lý hiện tượng cho môi trường dùng. Thừa kế giúp ta thể hiện được phần chung trong tác dụng của các thuật toán. Một sự chọn lựa khác thay cho thừa kế. Bằng thừa kế ta cũng có thể phối hợp nhiều kiểu thuật toán và cách xử lý hiện tượng. Ta có thể thừa kế trực tiếp từ Context và cho nónhững sử sự khác nhau. Nhưng giải pháp này gắn chặt cách xử lý hiện tượng vào đối tượng Context, gây ra lẫn giữa cài đặt thuật toán và Context, gây khó khăn cho việc học, bảo dưỡng, mở rộng Context, vàchúng ta không thể kết hợp các thuật toán một cách ling động. Giải pháp này sẽ tạo ra rất nhiều lớp tương tự, chỉ khác nhau ở thuật toán hoặc cách xử lý hiện tượng mà chúng thực hiện. Bao bọc thuật toán bởi các lớp khác nhau cho ta kết hợp các thuật toán độc lập đối với môi trường sử dụng, đơn giản hoá việc hiểu, chọn và mở rộng từng thuật toán. Bỏ đi các câu lệnh điều kiện (if-then-else, switch). Mẫu thiết kế Strategy cho ta một cách giải quyết khác ngoài cách dùng câu lệnh điều kiện trong quá trình chọn cách xử lý thích hợp. Khi những cách xử lý khác nhau bị gói vào một lớp, dùng câu lệnh điều kiện để chọn thao tách thích hợp rất khó khăn. Ta có thể thay những câu lệnh này bằng cách bao bọc các thuật toán bởi các lớp khác nhau. Ví dụ nếu không có Strategy, việc "chia dòng" được thực hiện như sau: void Composition::Repair {       switch (_breakingStrategy) {            case SimpleStrategy: ComposeWithSimpleCompositor; break; case TeXStrategy: ComposeWithTeXCompositor; break; //...        }         // merge results with existing composition, if necessary (gắn kết        //quả với phần đã làm được) } Mẫu thiết kế Strategy thay việc sử dụng câu lệnh điều kiện bằng ủy nhiệm việc chia dòng cho đối tượng Strategy: void Composition::Repair {       _compositor->Compose; // merge results with existing composition, if necessary(gắn kết        // quả với phần đã làm được) }