设计模式-过滤器模式-结构型

定义:

使用不同的标准来过滤一组对象,对程序的请求做一些预处理

类型:

结构型

理解:

该设计模式通过定义多个不同标准的过滤器来,通过逻辑运算的方式把它们连接起来,过滤出符合条件的内容,比如可以用于根据不同条件过滤出我们所需要的数据,或者在输入框中限制用户输入的内容

//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;
            }
        }
        .. ..
}
优点:
  • 可以通过定义不同标准来过滤所需要的数据
  • 符合开闭原则,当需要增加过滤器的时候,不需要修改原来的类
缺点:

定义各种过滤器使得类的个数增加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值