过滤器模式

一、简介

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

二、代码

package main

import (
"errors"
"fmt"
"log"
"strconv"
"strings"
) // Request is the input of the filter
type Request interface{} // Response is the output of the filter
type Response interface{} // Filter interface is the definition of the data processing components
// Pipe-Filter structure
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("input data must be string")
}
parts := strings.Split(str, sf.delimiter)
return parts, nil
} type ToIntFilter struct {
} func NewToIntFilter() *ToIntFilter {
return &ToIntFilter{}
} func (tif *ToIntFilter) Process(data Request) (Response, error) {
parts, ok := data.([]string)
if !ok {
return nil, fmt.Errorf("input data should be []string")
}
ret := make([]int, 0)
for _, part := range parts {
s, err := strconv.Atoi(part)
if err != nil {
return nil, err
}
ret = append(ret, s)
}
return ret, 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, errors.New("input data should be []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,
}
} // call each filter's process function
func (p *Pipeline) Process(data Request) (Response, error) {
var ret interface{}
var err error
for _, filter := range *p.Filters {
ret, err = filter.Process(data)
if err != nil {
return ret, err
}
data = ret
}
return ret, err
} func main() {
//例子中将字符串分割,再转成int,再求和
split := NewSplitFilter(",")
converter :=NewToIntFilter()
sum := NewSumFilter()
p :=NewPipeline("p1", split, converter, sum)
ret, err := p.Process("4,5,6")
if err != nil {
log.Fatal(err)
}
if ret != 15 {
log.Fatalf("The expected is 6, but the actual is %d", ret)
}
fmt.Println(ret)
}

完整代码:https://gitee.com/ncuzhangben/GoStudy/tree/master/go-design-pattern/07-Filter

三、参考链接

1、https://www.runoob.com/design-pattern/filter-pattern.html

[07]Go设计模式:过滤器模式(FilterPattern)的更多相关文章

  1. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...

  2. 设计模式系列之过滤器模式(Chriteria Pattern)

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...

  3. 设计模式之过滤器模式(php实现)

    /** * github地址:https://github.com/ZQCard/design_pattern * 过滤器模式(Filter Pattern)或标准模式(Criteria Patter ...

  4. 【设计模式 - 7】之过滤器模式(Filter)

    1      模式简介 过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来. 2      实例 需求 ...

  5. 设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...

  6. Java设计模式应用——过滤器模式

    storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...

  7. 过滤器模式(Filter Pattern)

    过滤器模式 一.什么是过滤器模式   过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型 ...

  8. Java设计模-过滤器模式

    过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...

  9. 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

    [转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...

随机推荐

  1. NPM——npm|cnpm如何升级

    前言 手动更新了node.js版本后,想要升级下npm的版本 步骤 其实无论npm还是cnpm升级的命令都是一样的,除了需要指定包名. 升级npm $ npm install -g npm 查看npm ...

  2. c#中的new和override的实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 简单说,抽象方法是需要 ...

  3. TED演讲:别不信,你只需20个小时,就能学会任何事情!

    https://www.bilibili.com/video/av50668972/?spm_id_from=333.788.videocard.3 two years ago, my life ch ...

  4. 洛谷 P2512 [HAOI2008]糖果传递 题解

    每日一题 day47 打卡 Analysis 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小 ...

  5. Greenplum 与 PostgreSQL 修改元数据(catalog)的方法 allow_system_table_mods

    背景 PostgreSQL大量的信息保存在元数据中,所有的元数据都是内部维护的,例如建表.建索引.删表等操作,自动维护元数据. 在某些迫不得已的情况下才可能需要直接对元数据进行修改. 默认情况下,用户 ...

  6. jsp大附件上传,支持断点续传

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  7. Linux 重启 PHP-FPM 命令

    1. 停止命令 pkill php-fpm 2.重启或启动命令 php-fpm -R

  8. 洛谷 P2850 [USACO06DEC]虫洞Wormholes 题解

    P2850 [USACO06DEC]虫洞Wormholes 题目描述 While exploring his many farms, Farmer John has discovered a numb ...

  9. linux命令之------Wc命令(word count)

    Wc命令(word count) 1)作用:用于计算字数: 2)-c或--bytes或--chars只显示Bytes数: 3)-l和—line显示行号: 4)-w或words只显示字数: 5)--he ...

  10. 洛谷P4380 [USACO18OPEN]Multiplayer Moo

    题目 第一问: 用广搜类似用\(floodfill\)的方法. 第二问: 暴力枚举加剪枝,对于每个连通块,枚举跟这个连通块相连的其他与他颜色不同的连通块,然后向外扩展合并颜色与他们俩相同的连通块.扩展 ...