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

目录

过滤器模式(Filter/Criteria Pattern)

代码实现


过滤器模式(Filter/Criteria Pattern)

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

代码实现

package mainimport ("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 := 0for _, elem := range elms {ret += elem}return ret, nil
}type Pipeline struct {Name    stringFilters *[]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 errorfor _, 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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】一维数组的聚类

在学习聚类算法的过程中,学习到的聚类算法大部分都是针对n维的,针对一维数据的聚类方式较少,今天就来学习下如何给一维的数据进行聚类。 方案一:采用K-Means对一维数据聚类 Python代码如下: from sklearn.cluster im…

shell语言判断

目录 判断: shell条件测试 数值比较 文件测试 字符串比较 and和or 流程控制if: 单分支结构: 双分支结构 多分支结构 嵌套结构 调试脚本 注意: 测试语法: 模式匹配:case 判断: …

Vue 防止页面闪烁 v-cloak

v-cloak 指令&#xff1a;用于解决页面渲染的过程中&#xff0c;出现闪烁的问题。 注&#xff1a;当网速较慢&#xff0c;来不及渲染时&#xff0c;页面上就会出现源码【例如&#xff1a;{{ xxx }} 】。 语法格式&#xff1a; <template><div v-cloak>内容</d…

[python库] mistune库的基本使用

前言 mistune库是一个解析Markdown的利器&#xff0c;使用起来非常简单。当我们想要解析Markdown格式的文档时&#xff0c;只需两步就能将其转换成html格式。如下&#xff1a; import mistune mistune.html(YOUR_MARKDOWN_TEXT)安装方式也非常简单&#xff0c;dddd&#xff1…

JavaSE基础50题:10. 计算1/1-1/2+1/3-……+1/99-1/100的值(两种方法)

概述 计算1/1 - 1/2 1/3 - …… 1/99 - 1/100的值。 当分母为偶数时&#xff0c;符号是负的&#xff0c;放分母为奇数时&#xff0c;符号是负的。 方法一 用 flg 做了一个正负交替 【代码】 public static double func() {double sum 0;int flg 1; //设置正负号的for (i…

java中可重入锁是什么?

可重入锁是一种支持同一个线程多次获得同一把锁的锁机制。在 Java 中&#xff0c;synchronized 关键字和 ReentrantLock 类都支持可重入锁。 可重入锁的主要特点是允许同一个线程多次获取同一把锁&#xff0c;而不会导致死锁。这使得在进行递归调用或者多层调用的情况下&#…

CopyOnWriteArraySet怎么用

简介 CopyOnWriteArraySet是一个线程安全的无序集合&#xff0c;它基于“写时复制”的思想实现。它继承自AbstractSet&#xff0c;可以将其理解成线程安全的HashSet。 CopyOnWriteArraySet在读取操作比较频繁、写入操作相对较少的情况下可以提高程序的性能和可靠性。它的线程…

力扣每日一题day29[102. 二叉树的层序遍历]

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建PG开源数据库

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

配置Ubuntu18.04使iptables规则重启系统后仍然有效

第一步&#xff1a;保存iptables规则到文件 /etc/iptables.rules iptables-save > /etc/iptables.rules 第二步&#xff1a;将如下代码写入 /etc/rc.local #!/bin/sh iptables-restore < /etc/iptables.rules 第三步&#xff1a;为 /etc/rc.local 文件赋可执行权限 …

docker安装node及使用

文章目录 一、安装node二、创建node容器三、进入创建的容器如有启发&#xff0c;可点赞收藏哟~ 一、安装node 查看可用版本 docker search node安装最新版本 docker install node:latest二、创建node容器 docker run -itd --name node-test node–name node-test&#xff1…

VUE.js

后端&#xff1a; BookMapper&#xff1a; <select id"selectBybookname" resultMap"BaseResultMap" parameterType"java.lang.String" >select<include refid"Base_Column_List" />from t_book<where><if tes…

NOIP2014提高组第二轮day1 - T3:飞扬的小鸟

#题目链接 [NOIP2014 提高组] 飞扬的小鸟 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度&#xff0c;让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话&#xff0c;便宣告失败…

深度解析 Kafka 消息保证机制

Kafka作为分布式流处理平台的重要组成部分&#xff0c;其消息保证机制是保障数据可靠性、一致性和顺序性的核心。在本文中&#xff0c;将深入探讨Kafka的消息保证机制&#xff0c;并通过丰富的示例代码展示其在实际应用中的强大功能。 生产者端消息保证 1 At Most Once &quo…

pip的常用命令

安装、卸载、更新包&#xff1a;pip install [package-name]&#xff0c;pip uninstall [package-name]&#xff0c;pip install --upgrade [package-name]。升级pip&#xff1a;pip install --upgrade pip。查看已安装的包&#xff1a;pip list&#xff0c;pip list --outdate…

ubuntu22.04 显卡驱动最简单的安装方法

1.拉取可选择安装的显卡驱动版本 sudo apt-get purge nvidia* #apt 的 update 和 upgrade 的区别 #apt update 命令只会获得系统上所有包的最新信息&#xff0c;并不会下载或者安装任何一个包。 #apt upgrade 命令来把这些包下载和升级到最新版本。 2.sudo apt update 3.安装…

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-GRU-Multihead-Attention…

TCP通讯

TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需要先发送消息 看看客户端是否能够接收到消息 如果没有回复消息的话 服务端 就不会发出文件 等待客户端回复消息&#xff0c…

结构体,自定义类型

目录 结构体 结构体的声明 结构体的自引用 结构体的定义和初始化 结构体内存对齐 ​编辑 结构体的对齐规则&#xff1a; 为什么存在内存对齐&#xff1f; 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 枚举 联合&#xff08;共用体…

文件管理:每个文件夹只移入1个文件要怎样操作?批量移动文件技巧

在文件管理过程中&#xff0c;有时要将多个文件分别移动到不同的文件夹中&#xff0c;每个文件夹只包含一个文件。这样的需求可能出现在许多场景中&#xff0c;比如整理文件、备份资料或者进行特定的项目处理。如果每个手动去移动文件就会出现丢失的情况&#xff0c;以及太过耗…