定义:
使用不同的标准来过滤一组对象,对程序的请求做一些预处理
类型:
结构型
理解:
该设计模式通过定义多个不同标准的过滤器来,通过逻辑运算的方式把它们连接起来,过滤出符合条件的内容,比如可以用于根据不同条件过滤出我们所需要的数据,或者在输入框中限制用户输入的内容
//age:年龄,sex:性别,1:男;0:女
class Person(val age:Int,val sex:Int){
}
//定义过滤器接口
interface IFilter {
fun filter(persons :ArrayList<Person>):ArrayList<Person>
}
//过滤年龄
class AgeFilter(private val minAge:Int, private val maxAge:Int) :IFilter {
override fun filter(persons: ArrayList<Person>): ArrayList<Person> {
val result = ArrayList<Person>()
for(person:Person in persons){
if(person.age in minAge..maxAge){
result.add(person)
}
}
return result
}
}
//过滤性别
class SexFilter(private val sex: Int) : IFilter {
override fun filter(persons: ArrayList<Person>): ArrayList<Person> {
val result = ArrayList<Person>()
for (person: Person in persons) {
if (person.sex == sex) {
result.add(person)
}
}
return result
}
}
//过滤器管理类
class PersonFilterManager : IFilter {
private val filters = ArrayList<IFilter>()
fun addFilter(filter: IFilter) {
filters.add(filter)
}
fun removeFilter(filter: IFilter) {
filters.remove(filter)
}
override fun filter(persons: ArrayList<Person>): ArrayList<Person> {
var result = persons
for (filter: IFilter in filters) {
result = filter.filter(result)
}
return result
}
}
//测试类
fun main(args: Array<String>) {
val persons = ArrayList<Person>()
for (i: Int in 1..100) {
val person = Person(i, i % 2)//1为男性、0为女性
persons.add(person)
}
val filterManager = PersonFilterManager()
filterManager.addFilter(AgeFilter(18, 25))//年龄过滤器
filterManager.addFilter(SexFilter(1))//男性过滤器
val result = filterManager.filter(persons)
for (person: Person in result) {
println("age:${person.age},sex:${if (person.sex == 1) {
'男'
} else {
'女'
}}")
}
}
运行结果:
age:19,sex:男
age:21,sex:男
age:23,sex:男
age:25,sex:男
Process finished with exit code 0
类结构图如下:
Android中的过滤器模式:
最常见的就是给EditText设置filters以达到限制输入的目的,通过源码我们可以看到,setFilters是TextView中的方法,而EditText是继承自TextView的:
public void setFilters(InputFilter[] filters) {
if (filters == null) {
throw new IllegalArgumentException();
}
mFilters = filters;
if (mText instanceof Editable) {
setFilters((Editable) mText, filters);
}
}
private void setText(CharSequence text, BufferType type,
boolean notifyBefore, int oldlen) {
.. ..
int n = mFilters.length;
for (int i = 0; i < n; i++) {
CharSequence out = mFilters[i].filter(text, 0, text.length(), EMPTY_SPANNED, 0, 0);
if (out != null) {
text = out;
}
}
.. ..
}
优点:
- 可以通过定义不同标准来过滤所需要的数据
- 符合开闭原则,当需要增加过滤器的时候,不需要修改原来的类
缺点:
定义各种过滤器使得类的个数增加