คุณยังไม่ได้พูดว่าตัวกรองใช้พารามิเตอร์ใด ๆ หรือไม่ ตัวอย่างเช่นfilter_A
อาจเป็นตัวกรองหมวดหมู่เพื่อให้ไม่ใช่แค่คำถาม "ฉันต้องใช้filter_A
" หรืออาจเป็น "ฉันต้องใช้filter_A
และส่งกลับระเบียนทั้งหมดด้วยฟิลด์ category = fooCategory
"
วิธีที่ง่ายที่สุดในการใช้สิ่งที่คุณอธิบายไว้(แต่ให้แน่ใจว่าได้อ่านคำตอบครึ่งหลังด้านล่าง)นั้นคล้ายกับคำตอบอื่น ๆ แต่ฉันจะไม่ตรวจสอบบูลีนเลย FilterA, FilterB, FilterC
ฉันจะกำหนดอินเตอร์เฟซ: จากนั้นคุณสามารถมีสิ่งที่ชอบ (ฉันเป็นโปรแกรมเมอร์ Java ดังนั้นนี่จะเป็นไวยากรณ์ของ Java-esque):
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
จากนั้นคุณสามารถมีลักษณะดังนี้ (ใช้รูปแบบ enum singletonจากEffective Java ):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
แต่ถ้าคุณต้องการกรองบางรายการคุณสามารถให้อินสแตนซ์ของการFilterA
ใช้งานที่ทำอะไรบางอย่างแทน วิธีการกรองของคุณจะง่ายมาก
List<Item> filterItems(List<Item> data, RequestFilters filters) {
List<Item> returnedList = data;
returnedList = filters.filterA.filter(data);
returnedList = filters.filterB.filter(data);
returnedList = filters.filterC.filter(data);
return returnedList;
}
แต่ฉันเพิ่งเริ่มต้น
ฉันสงสัยว่าการapplyFilter
โทรจะคล้ายกันจริงสำหรับตัวกรองทั้งสามประเภท หากเป็นกรณีนี้ฉันจะไม่ทำตามที่อธิบายไว้ข้างต้น คุณสามารถรับโค้ดที่สะอาดยิ่งขึ้นได้โดยมีเพียงอินเทอร์เฟซเดียวจากนั้นทำสิ่งนี้:
class ChainedFilter implements Filter {
List<Filter> filterList;
void addFilter(Filter filter) {
filterList.add(filter);
}
List<Item> applyFilter(List<Item> input) {
List<Item> returnedList = input;
for(Filter f : filterList) {
returnedList = f.applyFilter(returnedList);
}
return returnedList;
}
}
จากนั้นเมื่อผู้ใช้ของคุณนำทางไปยังหน้าต่างๆคุณเพียงเพิ่มอินสแตนซ์ใหม่ของตัวกรองสิ่งที่คุณต้องการเมื่อเหมาะสม นี้จะช่วยให้คุณสามารถที่จะใช้กรณีหลายตัวกรองเดียวกันกับการขัดแย้งที่แตกต่างกันคุณควรต้องพฤติกรรมว่าในอนาคตและยังเพิ่มตัวกรองเพิ่มเติมในอนาคตโดยไม่ต้องเปลี่ยนการออกแบบของคุณ
นอกจากนี้คุณสามารถเพิ่มบางอย่างเช่นNoOpFilter
ด้านบนหรือคุณไม่สามารถเพิ่มตัวกรองเฉพาะลงในรายการได้ทุกสิ่งที่ง่ายสำหรับโค้ดของคุณ