您的位置:首页 > 其它

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

2017-08-16 22:23 447 查看
     过滤器模式(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设计模式·目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: