[设计模式](九):过滤器模式(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设计模式·目录
阅读全文
1 0
- [设计模式](九):过滤器模式(Filter)及Kotlin的Filter模式
- 设计模式:Filter过滤器
- java 设计模式之过滤器模式(Filter)
- 设计模式【过滤器模式Filter Pattern】
- 【设计模式】过滤器模式(Filter Pattern)
- 过滤器模式-Filter Pattern
- 【设计模式 - 7】之过滤器模式(Filter)
- Java设计模式——过滤器模式(Filter Pattern)
- 【设计模式】拦截过滤器模式(Intercepting Filter Pattern)
- 过滤器模式(Filter Pattern)
- Java Filter Pattern(过滤器模式)
- 【设计模式】Filter-Chain 的应用
- 管道过滤器(Pipe-And-Filter)模式
- 设计模式 - C++ - Pipe/Filter模式
- 设计模式学习—拦截过滤器模式(Intercepting Filter Design Pattern)
- Filter路径的匹配模式
- J2EE设计模式浅谈(二)之Filter
- Java Filter 与 责任链设计模式
- Java集合 List—add size get contains addAll index indexOf
- 图像处理中的模板匹配c++实现
- 快速排序的实现
- python3 centos下安装tkinter
- 0816-java集合接口
- [设计模式](九):过滤器模式(Filter)及Kotlin的Filter模式
- zookeeper单机版安装
- Rman中各种format参数说明
- 迭代器
- 网易编程题 等差数列
- 简述Java类的“初始化”
- 『区块链+TR069协议』打造全球通用区块链物联网
- SQL---Lpad()函数,Rpad()函数,数据库
- HDU-6122 Color the chessboard(思维题)