過濾器顧名思義,定義一些過濾規則,將符合要求的內容篩選,就比如過濾不同大小或者不同顏色的水果,需要顏色和大小過濾器,篩選條件獨立為對象,可以通過靈活組合形成過濾鏈條。避免大量使用判斷語句。
案例代碼:篩選不同顏色的蘋果
- 被過濾對象(蘋果)
// 蘋果對象
class Apple {private String color;private int weight;public Apple(String color, int weight) {this.color = color;this.weight = weight;}public String getColor() { return color; }public int getWeight() { return weight; }
}
- 過濾器接口
// 過濾器接口
interface Filter {List<Apple> filter(List<Apple> apples);
}
- 具體過濾器實現
// 顏色過濾器(篩選紅色蘋果)
class ColorFilter implements Filter {public List<Apple> filter(List<Apple> apples) {List<Apple> result = new ArrayList<>();for (Apple apple : apples) {if ("red".equalsIgnoreCase(apple.getColor())) {result.add(apple);}}return result;}
}// 重量過濾器(篩選重量大于150g的蘋果)
class WeightFilter implements Filter {public List<Apple> filter(List<Apple> apples) {List<Apple> result = new ArrayList<>();for (Apple apple : apples) {if (apple.getWeight() > 150) {result.add(apple);}}return result;}
}
- 組合過濾器(多條件篩選)
// 組合過濾器(同時滿足多個條件)
class AndFilter implements Filter {private Filter filter1;private Filter filter2;public AndFilter(Filter filter1, Filter filter2) {this.filter1 = filter1;this.filter2 = filter2;}public List<Apple> filter(List<Apple> apples) {List<Apple> temp = filter1.filter(apples);return filter2.filter(temp);}
}
- 使用過濾器模式
public class FilterDemo {public static void main(String[] args) {List<Apple> apples = Arrays.asList(new Apple("Red", 200),new Apple("Green", 160),new Apple("Red", 140));// 單條件篩選:紅色蘋果Filter colorFilter = new ColorFilter();List<Apple> redApples = colorFilter.filter(apples);System.out.println("紅色蘋果數量:" + redApples.size()); // 輸出:2// 組合篩選:紅色且重量>150gFilter weightFilter = new WeightFilter();Filter andFilter = new AndFilter(colorFilter, weightFilter);List<Apple> result = andFilter.filter(apples);System.out.println("符合條件的蘋果數量:" + result.size()); // 輸出:1}
}
應用場景案例:用戶權限過濾
場景描述
篩選出同時滿足以下條件的用戶:
- 年齡在18歲以上
- 所在城市為“北京”
- 注冊時間在2023年以后
代碼實現
// 用戶對象
class User {private String name;private int age;private String city;private LocalDate registerDate;public User(String name, int age, String city, LocalDate registerDate) {this.name = name;this.age = age;this.city = city;this.registerDate = registerDate;}// Getter方法省略...
}// 年齡過濾器
class AgeFilter implements Filter {private int minAge;public AgeFilter(int minAge) {this.minAge = minAge;}public List<User> filter(List<User> users) {List<User> result = new ArrayList<>();for (User user : users) {if (user.getAge() >= minAge) {result.add(user);}}return result;}
}// 城市過濾器
class CityFilter implements Filter {private String city;public CityFilter(String city) {this.city = city;}public List<User> filter(List<User> users) {List<User> result = new ArrayList<>();for (User user : users) {if (city.equalsIgnoreCase(user.getCity())) {result.add(user);}}return result;}
}// 注冊時間過濾器
class DateFilter implements Filter {private LocalDate startDate;public DateFilter(LocalDate startDate) {this.startDate = startDate;}public List<User> filter(List<User> users) {List<User> result = new ArrayList<>();for (User user : users) {if (user.getRegisterDate().isAfter(startDate)) {result.add(user);}}return result;}
}// 使用示例
public class UserFilterDemo {public static void main(String[] args) {List<User> users = Arrays.asList(new User("張三", 25, "北京", LocalDate.of(2024, 1, 1)),new User("李四", 17, "上海", LocalDate.of(2024, 2, 1)),new User("王五", 30, "北京", LocalDate.of(2022, 5, 1)));// 創建過濾器Filter ageFilter = new AgeFilter(18);Filter cityFilter = new CityFilter("北京");Filter dateFilter = new DateFilter(LocalDate.of(2023, 1, 1));// 組合過濾:年齡>=18 && 城市=北京 && 注冊時間>2023Filter combinedFilter = new AndFilter(ageFilter, new AndFilter(cityFilter, dateFilter));List<User> validUsers = combinedFilter.filter(users);System.out.println("有效用戶數量:" + validUsers.size()); // 輸出:1}
}
過濾器模式應用場景
- 數據篩選:
- 電商商品篩選(價格、品牌、評分)
- 日志過濾(錯誤級別、時間范圍)
- 權限系統:
- 用戶角色過濾(管理員、VIP用戶)
- 數據權限過濾(部門、區域)
- 數據清洗:
- 去除無效數據(空值、異常值)
- 敏感信息過濾(手機號脫敏)
過濾器模式優勢
- 靈活組合條件:通過組合多個過濾器實現復雜邏輯
- 解耦過濾邏輯:每個過濾器獨立維護,新增條件無需修改已有代碼
- 可復用性高:同一過濾器可用于不同場景(如“北京用戶篩選”可用于報表和推送)