2014-09-30 12 views
5

Tôi có một danh sách các đối tượng sẽ được lọc.Mẫu thiết kế để lọc các đối tượng

Bộ lọc này sẽ bao gồm ít nhất 3 quy tắc.

Vì vậy, ví dụ:

public class Filtering { 

List<MyObject> myObjectList; 

List<MyObject> filterStep1(List<MyObject> myObjectList){ 

    for(Myobject myobj : myObjectList){ 
     if(isCriteriaSatisified){ 
      continue 
     } 
     else { 
      removeThisObjectFromList 
     } 
    } 
} 


List<MyObject> filterStep2(List<MyObject> myObjectList){ 

    for(Myobject myobj : myObjectList){ 
     if(isCriteriaSatisified){ 
      continue 
     } 
     else { 
      removeThisObjectFromList 
     } 
    } 
} 

} 

Tôi thích phương pháp này vì nó rất đơn giản, khép kín và có thể nhìn thấy rất dễ dàng gì đang cố gắng để đạt được.

Nhưng có lẽ có một mẫu thiết kế tôi nên sử dụng thay thế?

Mẫu "Chuỗi trách nhiệm" là thứ mà tôi đang xem xét nơi bộ lọcStep1 & filterStep2 ở trên mã sẽ được cấu trúc lại thành một trình xử lý riêng biệt.

+1

Bạn có thể xem xét API luồng của Java8, cung cấp các tùy chọn lọc tuyệt vời cho các đối tượng Bộ sưu tập. –

+1

Câu hỏi này sẽ phù hợp hơn với [Đánh giá mã] (http://codereview.stackexchange.com/) so với Stack Overflow. – ZeroOne

+1

Chỉ một nhận xét: bạn đang sửa đổi danh sách gốc. Những gì tôi gọi là lọc sẽ tạo ra một danh sách mới chỉ chứa các phần tử hợp lệ mà không sửa đổi danh sách gốc. –

Trả lời

4

Đây là mẫu "ống và bộ lọc" và trong khi triển khai của bạn vẫn ổn, tốt hơn là không mã hóa logic lọc theo phương pháp. Thay vào đó, hãy viết một Predicate<MyObject> cho mỗi điều kiện boolean của bạn (một trong hai điều kiện được xây dựng trong Java 8 hoặc từ một trong những từ tiếng ổi). Việc kiểm tra này dễ dàng hơn nhiều và có thể dễ dàng áp dụng cho các API sạch hiện có, chẳng hạn như API luồng hoặc chế độ xem bộ sưu tập của ổi.

+0

Tôi đồng ý sử dụng các chức năng để lọc sạch hơn nhiều nhưng tôi không thể sử dụng API Java8. Vì vậy, tôi sẽ sử dụng tùy chọn được đề xuất của tôi trong câu hỏi. Cảm ơn –

+0

@ blue-sky Nhìn vào ổi như một tùy chọn để triển khai mẫu. – chrylis

2

Một lựa chọn sử dụng Java 8 suối:

myObjects.stream().filter(this::isCriteriaSatisified).filter(this::anotherCriteria) 

Giả sử bạn có một phương pháp boolean isCriteriaSatisified(myObj) trong lớp học của bạn. Sau đó, bạn có thể thu thập luồng đó vào Danh sách khác.

Các vấn đề liên quan