GO设计模式——9、过滤器模式(结构型)

目录

[过滤器模式(Filter/Criteria Pattern)](#过滤器模式(Filter/Criteria Pattern))

代码实现


过滤器模式(Filter / Criteria Pattern)

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。可以自由组合不同的过滤条件。

代码实现

Go 复制代码
package main

import (
    "fmt"
    "log"
    "strconv"
    "strings"
)

type Request interface {
}

type Response interface {
}

type Filter interface {
    Process(data Request) (Response, error)
}

type SplitFilter struct {
    delimiter string
}

func NewSplitFilter(delimiter string) *SplitFilter {
    return &SplitFilter{delimiter}
}
func (sf *SplitFilter) Process(data Request) (Response, error) {
    str, ok := data.(string)
    if !ok {
       return nil, fmt.Errorf("输入数据必须为String类型")
    }
    parts := strings.Split(str, sf.delimiter)
    return parts, nil
}

type ToIntFilter struct {
}

func NewToIntFilter() *ToIntFilter {
    return &ToIntFilter{}
}
func (ttf *ToIntFilter) Process(data Request) (Response, error) {
    parts, ok := data.([]string)
    if !ok {
       return nil, fmt.Errorf("输入数据必须为[]String类型")
    }
    res := make([]int, 0)
    for _, part := range parts {
       s, err := strconv.Atoi(part)
       if err != nil {
          return nil, err
       }
       res = append(res, s)
    }
    return res, nil
}

type SumFilter struct {
}

func NewSumFilter() *SumFilter {
    return &SumFilter{}
}
func (sf *SumFilter) Process(data Request) (Response, error) {
    elms, ok := data.([]int)
    if !ok {
       return nil, fmt.Errorf("输入数据必须为[]int类型")
    }
    ret := 0
    for _, elem := range elms {
       ret += elem
    }
    return ret, nil
}

type Pipeline struct {
    Name    string
    Filters *[]Filter
}

func NewPipeline(name string, filters ...Filter) *Pipeline {
    return &Pipeline{
       Name:    name,
       Filters: &filters,
    }
}
func (p *Pipeline) Process(data Request) (Response, error) {
    var res interface{}
    var err error
    for _, filter := range *p.Filters {
       res, err = filter.Process(data)
       if err != nil {
          return res, err
       }
       data = res
    }
    return res, err
}

func main() {
    //将字符串分割,再转成int,再求和
    split := NewSplitFilter(",")
    toInt := NewToIntFilter()
    sum := NewSumFilter()
    p := NewPipeline("p1", split, toInt, sum)
    res, err := p.Process("4,5,6")
    if err != nil {
       log.Fatal(err)
    }
    if res != 15 {
       log.Fatalf("不是预期值:%d", res)
    }
    fmt.Println(res)
}
相关推荐
moMo1 分钟前
LangChain 到 LangGraph: RAG 知识库改造
后端
用户574385305118 分钟前
元数据驱动的通用 CRUD 后端框架 (3- createBusiness 工厂:三层装配 + 一行出 REST)
后端
高级程序源30 分钟前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
Sam_Deep_Thinking35 分钟前
new Thread()之后发生了什么?
java·后端·面试·程序员
泡海椒36 分钟前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)1 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
步行cgn1 小时前
Spring util 命名空间详解
java·后端·spring
2501_933670791 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
打工仔折腾 AI2 小时前
普通摄像头接入AI识别:绿联NAS部署Frigate监控实战
人工智能·后端·python·性能优化·ai agent 实战
菜鸟~noob2332 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium