[设计模式](九):过滤器模式(Filter)及Kotlin的Filter模式
2017-08-16 22:23
447 查看
过滤器模式(Filter)是常用的一种结构模式,也是最后一种常用的结构模式。由于其的常用,在kotlin中甚至被当做一种lambda函数简化。
>什么是过滤器模式?
过滤器,是用来过滤一组特地的对象,筛选出符合目标的对象以供使用。
让我们从一个例子讲起。
在CS游戏中,CT和T能从商店买到的枪是不一样的,每次当有一个玩家打开商店时,就有一组过滤器过滤出他能买到的枪并显示。
让我们看看用代码怎么实现:
很简单,没什么难度。这里要顺便介绍一下Kotlin对过滤器模式的优化:filter(){}函数方法。
实际上,上面CTPermissionFilter的类可以这样重新写:
至于它基于什么设计原则,唯一能扯上点边的只有SRP和OCP了,可能还有一点CRP的意味。
>>[设计模式]OOP设计模式·目录
>什么是过滤器模式?
过滤器,是用来过滤一组特地的对象,筛选出符合目标的对象以供使用。
让我们从一个例子讲起。
在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设计模式·目录
相关文章推荐
- java 设计模式之过滤器模式(Filter)
- 设计模式【过滤器模式Filter Pattern】
- 【设计模式 - 7】之过滤器模式(Filter)
- 设计模式学习—拦截过滤器模式(Intercepting Filter Design Pattern)
- 【设计模式 - 7】之过滤器模式(Filter)
- 设计模式八 之 过滤器模式(Filter Pattern)
- 【设计模式】过滤器模式(Filter Pattern)
- 【javaweb:Filter】通过过滤器和装饰设计模式解决request的全局乱码
- 【设计模式】拦截过滤器模式(Intercepting Filter Pattern)
- Command设计模式-文件过滤器FilenameFilter
- Kotlin实现MVP设计模式
- Kotlin 设计模式-装饰器
- 责任链或过滤器模式2-使用过滤链-马士兵设计模式教程 .
- struts2拦截器和过滤器的区别以及用到的设计模式
- 设计模式之管道和过滤器的应用
- java 设计模式 责任链 filter
- 过滤器模式(Filter/Criteria Pattern)
- 责任链或过滤器模式1-使用过滤器-马士兵设计模式教程 .
- Kotlin设计模式-单例
- java设计模式之过滤器模式