[设计模式](九):过滤器模式(Filter)及Kotlin的Filter模式

来源:互联网 发布:淘宝免费下载 编辑:程序博客网 时间:2024/06/06 03:43

     过滤器模式(Filter)是常用的一种结构模式,也是最后一种常用的结构模式。由于其的常用,在kotlin中甚至被当做一种lambda函数简化。

>什么是过滤器模式?

     过滤器,是用来过滤一组特地的对象,筛选出符合目标的对象以供使用。

     让我们从一个例子讲起。

     在CS游戏中,CT和T能从商店买到的枪是不一样的,每次当有一个玩家打开商店时,就有一组过滤器过滤出他能买到的枪并显示。

     让我们看看用代码怎么实现:

enum class ArmsPermission{    Both,OnlyCT,OnlyT // 枚举类,枚举类CT和T的购买权限}abstract class Weapon{    abstract val permission:ArmsPermission // 武器的购买权限}class WeaponFactory{    fun createAllWeapons():List<Weapon>{ // 一次性给出所有的武器        var allweapons = mutableListOf<Weapon>()        return allweapons    }}//这是一个过滤器的抽象interface PermissionFilter{    fun filter(allWeapons:List<Weapon>):List<Weapon>}class CTPermissionFilter:PermissionFilter{ // CT的过滤器    override fun filter(allWeapons: List<Weapon>): List<Weapon> {        var weaponList:MutableList = mutableListOf()        for( i in allWeapons){            if(i.permission != ArmsPermission.OnlyT){                weaponList.add(i) // 筛选出CT可以购买的武器清单            }        }        return weaponList    }}//T的过滤器省略class Shoper(val consumer:Soldier){    fun createShoppingList():List<Weapon>{        if (consumer is CT){ // 判断顾客类型,并用相应的过滤器筛选出武器对象组            return CTPermissionFilter().filter(WeaponFactory().createAllWeapons())        } else {            return TPermissionFilter().filter(WeaponFactory().createAllWeapons())        }    }}

     很简单,没什么难度。这里要顺便介绍一下Kotlin对过滤器模式的优化:filter(){}函数方法。

     实际上,上面CTPermissionFilter的类可以这样重新写:

class CTPermissionFilter:PermissionFilter{    override fun filter(allWeapons: List<Weapon>): List<Weapon> {        return allWeapons.filter { o -> o.permission != ArmsPermission.OnlyT } // 是的,这是一个lambda函数    }}
     甚至连赋参都不需要:

class CTPermissionFilter:PermissionFilter{    override fun filter(allWeapons: List<Weapon>): List<Weapon> {        return allWeapons.filter { it.permission != ArmsPermission.OnlyT } // it关键字 对实现迭代器的集合是自动迭代的    }}
    过滤器模式比较简单,但是满常用的。

    至于它基于什么设计原则,唯一能扯上点边的只有SRP和OCP了,可能还有一点CRP的意味。



>>[设计模式]OOP设计模式·目录

原创粉丝点击