1、定义
1.1 模式引入
什么是过滤器模式?这种过滤模式在日常生活中经常会见到,比如在商场购物的时候,若是商场的会员则可以享受会员价,这里的是不是商场的会员就是我们的过滤条件,这种就是简单的过滤器模式应用。
1.2 模式定义
过滤器模式(Filter Pattern)属于结构型模式,它定义一种模式允许按照某种标准进行对象的过滤。就是按条件筛选一组对象
目的:使用不同的标准来过滤一组对象
实现:制定不同的规则来实现过滤,然后对过滤结果进行分组
2、组成角色
- AbstractFilter(抽象过滤角色):负责定义过滤器的实现接口
- ConcreteFilter(具体的过滤器角色):该角色实现过滤器的接口,负责具体过滤规则的逻辑实现,将过滤后的数据集结果返回
- Subject(被过滤的角色):按照具体的过滤规则被过滤的对象
3、应用场景
- 对api接口的请求和响应进行过滤拦截
- 对对象列表进行校验、筛选或预处理等场景
- 对数据进行过滤,例如敏感词过滤
4、设计要点
- 可插拔:过滤器的设计概念要求其支持可插拔设计
- 独立性:每种过滤器必须是独立的实体,其状态不受其它过滤器的影响,每个过滤器都有自己独立的数据输入输出接口,只要各个过滤器之间传送的数据遵守共同的规约就可以相连接。
5、实现模板
-
定义抽象规则接口
type FilterInterfaceName interface { RuleName(params StructName) StructName }
-
实现具体的过滤规则
type RuleFilterStructName Struct{}
func (r *RuleFilterStructName) Rule(params StructName) StructName
6、实现示例
以下举个简单的例子来帮助理解和了解过滤器的实现,例如在所有产品中过滤满足会员价的商品:
过滤器定义
package filter
// 商品定义
type Commodity struct {
Name string
Price float64
IsMember bool
}
// 过滤规则接口的定义
type Filter interface {
// 定义规则的接口方法
Rule(commodities []Commodity) []Commodity
}
// 会员规则定义
type MemberCommodityFilter struct {
}
// 实现会员规则的方法,返回会员商品
func (c *MemberCommodityFilter) Rule(commodities []Commodity) []Commodity {
if commodities == nil {
return nil
}
var memberCommodities []Commodity
for _,commodity := range commodities {
if commodity.IsMember {
memberCommodities = append(memberCommodities, commodity)
}
}
return memberCommodities
}
调用过滤器
package main
import (
"fmt"
"github.com/design/pattern/filter"
)
func main() {
// 过滤器模式
iphone12 := filter.Commodity{Name: "iphone12", Price: 6000.0, IsMember: true}
iphone13 := filter.Commodity{Name: "iphone13", Price: 6000.0, IsMember: false}
commodities := []filter.Commodity{iphone12, iphone13}
memberFilter := filter.MemberCommodityFilter{}
memberCommodities := memberFilter.Rule(commodities)
fmt.Printf("member commodities:%v", memberCommodities)
}