过滤器模式(Filter Pattern)

683 阅读2分钟

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)
}