Mẫu Chiến lược hoạt động tốt để tránh rất lớn nếu ... khác xây dựng và giúp dễ dàng thêm hoặc thay thế chức năng. Tuy nhiên, nó vẫn để lại một lỗ hổng trong quan điểm của tôi. Có vẻ như trong mọi triển khai vẫn cần phải có một cấu trúc phân nhánh. Nó có thể là một nhà máy hoặc một tập tin dữ liệu. Như một ví dụ lấy một hệ thống đặt hàng.
Nhà máy:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Mã sau này không cần phải lo lắng và hiện tại chỉ có một nơi để thêm loại đơn đặt hàng mới, nhưng phần mã này vẫn không thể mở rộng. Kéo nó ra thành một tệp dữ liệu giúp phần nào dễ đọc (gây tranh cãi, tôi biết):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Nhưng điều này vẫn bổ sung mã soạn sẵn để xử lý tệp dữ liệu - được cấp, mã dễ kiểm tra đơn vị hơn và tương đối ổn định, nhưng không phức tạp thêm.
Ngoài ra, loại cấu trúc này không kiểm tra tích hợp tốt. Mỗi chiến lược riêng lẻ có thể dễ dàng hơn để kiểm tra ngay bây giờ, nhưng mọi chiến lược mới mà bạn thêm là độ phức tạp bổ sung để kiểm tra. Nó ít hơn bạn sẽ có nếu bạn đã không sử dụng mô hình, nhưng nó vẫn ở đó.
Có cách nào để thực hiện mô hình chiến lược giảm thiểu sự phức tạp này không? Hoặc điều này chỉ đơn giản như nó được, và cố gắng đi xa hơn sẽ chỉ thêm một lớp trừu tượng cho ít để không có lợi?
eval
... có thể không hoạt động trong Java nhưng có thể bằng các ngôn ngữ khác?