Java設計模式之-過濾器模式
1. 什么是過濾器模式
過濾器模式(Filter Pattern)或者標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發(fā)人員使用不同的標準來過濾一組對象,通過邏輯運算符(如 AND、OR)來連接這些標準。
2. 主要解決什么問題
過濾器模式主要解決了在軟件開發(fā)中,我們經常需要對一些集合對象進行過濾的問題。這些過濾條件可能會非常復雜,包括多個條件和邏輯運算符。使用過濾器模式,我們可以將這些條件分解為多個單一的過濾器,然后將它們組合起來進行過濾,使得代碼更加清晰,更易于維護。
3. 在什么時候我們需要使用過濾器模式
在以下幾種情況下,我們可能需要使用過濾器模式:
當我們需要對一組對象根據某種標準進行過濾時。
當過濾標準可能會發(fā)生改變,或者在未來可能會出現新的過濾標準時。
4. 生活中的應用實例
過濾器模式就像我們在網購時使用的篩選功能。例如,在購買手機時,我們可能會根據價格、品牌、內存大小等多個標準進行篩選,這些標準可以單獨使用,也可以組合使用。
5. 優(yōu)點
靈活性好:過濾器模式可以靈活地使用不同的標準來過濾一組對象,還可以通過邏輯運算符來組合這些標準。
擴展性強:當需要增加新的過濾標準時,我們只需要添加新的過濾器,而無需修改現有代碼。
6. 缺點
如果過濾標準過多,可能會導致系統(tǒng)中存在大量的過濾器類,增加了系統(tǒng)的復雜性。
7. 使用場景
過濾器模式主要用在需要對一組對象根據某種標準進行過濾的場景中,例如電商平臺的商品篩選、郵件過濾等。
8. 代碼示例
// 定義一個對象
public class Phone {
? ? private String brand;
? ? private int price;
? ? // getters and setters
}
// 定義一個過濾器接口
public interface Filter {
? ? List<Phone> filter(List<Phone> phones);
}
// 定義一個具體的過濾器
public class BrandFilter implements Filter {
? ? private String brand;
? ? public BrandFilter(String brand) {
? ? ? ? this.brand = brand;
? ? }
? ? @Override
? ? public List<Phone> filter(List<Phone> phones) {
? ? ? ? return phones.stream()
? ? ? ? ? ? ? ? ? ? ?.filter(phone -> phone.getBrand().equals(brand))
? ? ? ? ? ? ? ? ? ? ?.collect(Collectors.toList());
? ? }
}
// 定義另一個具體的過濾器
public class PriceFilter implements Filter {
? ? private int maxPrice;
? ? public PriceFilter(int maxPrice) {
? ? ? ? this.maxPrice = maxPrice;
? ? }
? ? @Override
? ? public List<Phone> filter(List<Phone> phones) {
? ? ? ? return phones.stream()
? ? ? ? ? ? ? ? ? ? ?.filter(phone -> phone.getPrice() <= maxPrice)
? ? ? ? ? ? ? ? ? ? ?.collect(Collectors.toList());
? ? }
}
// 測試代碼
public class Client {
? ? public static void main(String[] args) {
? ? ? ? List<Phone> phones = new ArrayList<>();
? ? ? ? // 添加一些手機
? ? ? ? Filter brandFilter = new BrandFilter("Apple");
? ? ? ? List<Phone> applePhones = brandFilter.filter(phones);
? ? ? ? Filter priceFilter = new PriceFilter(5000);
? ? ? ? List<Phone> cheapPhones = priceFilter.filter(phones);
? ? }
}
在這個例子中,我們首先創(chuàng)建了一組手機對象,然后使用BrandFilter根據品牌進行過濾,接著使用PriceFilter根據價格進行過濾。每個過濾器都是獨立的,可以在這個例子中,我們首先創(chuàng)建了一組手機對象,然后使用BrandFilter根據品牌進行過濾,接著使用PriceFilter根據價格進行過濾。每個過濾器都是獨立的,可以單獨使用,也可以組合使用。這就是過濾器模式的魅力所在,它使得代碼更加清晰,更易于維護。