Hơi khó để chỉ ra những gì bạn muốn, vì vậy tôi sẽ đưa ra các giả định của riêng mình.
- Bộ sưu tập cơ bản nên không thay đổi sau khi lọc
- Kết quả là không dai dẳng
Một cách tiếp cận cổ điển là việc sử dụng xem. Đây là cơ bản lập trình lười biếng, nơi bạn tạo một đối tượng có thể truy cập bộ sưu tập gốc và biết bộ lọc để áp dụng nhưng sẽ không thực hiện bất kỳ tính toán nào miễn là không cần thiết.
Trên bộ sưu tập, lượt xem thường được triển khai với trình lặp và để lọc, tất nhiên là một Mẫu chiến lược đã được chỉ ra.
Ví dụ:
Collection myCollection;
Predicate myFilter;
// Nothing is computed here
View<Predicate> myView(myCollection, myFilter);
// We iterate until we find the first item in the collection that satisfies
// the Predicate, and no more, to initialize `begin`
View<Predicate>::Iterator begin = myView.begin(), end = myView.end();
Ưu điểm cuối cùng là nếu bạn (nói) chỉ cần 10 mục đầu tiên, sau đó bạn sẽ chỉ áp dụng vị càng nhiều càng cần thiết để tìm những 10 đầu tiên, và không còn nữa.
Ngoài ra, không có bản sao của các yếu tố liên quan và quan điểm của bạn được đảm bảo được cập nhật ngay cả khi bạn sửa đổi myCollection
, mặc dù điều này có thể ảnh hưởng đến tính hợp lệ của các trình lặp (như thường lệ).
Vấn đề là (trừ khi bạn triển khai bộ nhớ đệm), kết quả sẽ được tính mỗi lần.
Nếu bạn muốn có kết quả ổn định hơn, thì bạn nên xây dựng một bộ sưu tập mới chỉ chứa các mục được lọc (hoặc tham chiếu đến chúng). Không có mô hình chung ở đây cho nó phụ thuộc vào cách bạn muốn sử dụng danh sách 'đã lọc'.
Đối với Mẫu chiến lược được đề xuất, bạn thường có thể tạo bộ lọc của mình theo khối bằng cách sử dụng Mẫu tổng hợp và sau đó chuyển đối tượng được xây dựng làm chiến lược.
Mẫu hỗn hợp đặc biệt phù hợp để biểu thị kết quả của một biểu thức được phân tích cú pháp, ví dụ, bạn có thể muốn xem các cây biểu thức để có ý tưởng.
Bất cứ khi nào bạn đang xem xét các thuật toán thay đổi và cách bạn sắp xếp sẽ là một thuật toán (định nghĩa lỏng lẻo), mẫu chiến lược là giải pháp hợp lý, nhưng thực hiện được mở để tranh luận. –
[Mẫu thiết kế bộ lọc có ví dụ] (http://www.singhajit.com/filter-design-pattern/) –