GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1655|回复: 21
收起左侧

[技术交流] 【Go语言】利用责任链模式构造过滤链

  [复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲

     楼主| 白冥 发表于 2024-6-6 23:14:17 | 显示全部楼层 |阅读模式 <
    本帖最后由 白冥 于 2024-6-6 23:19 编辑

        假设你是一个电商平台的老板,为了扩大收益,想要根据用户偏好、商品销量和商品评价推送广告给特定用户,实现一个商品推荐系统。这个时候,你想起你旁边之前学过的编程知识的小明
    观前科普
        责任链模式是一种行为型设计模式,当请求被发送到一个处理器链上,链上的每一个处理器都可以决定是否处理该请求,或者传递给链上的下一个处理对象
        自然,责任链模式的每一个处理器都实现自同一个处理器接口,而且都可以自行决定处理。
        在这个案例中,由于场景的特殊性,我们让责任链模式的每一个处理器都进行过滤操作,直到链上所有的处理器都完成过滤,则就实现了过滤链。
        小明用Go语言写了一个过滤器链代码:
        type Filter[T any] interface {    // 过滤器接口,所有实现该接口的结构体都要实现该接口定义的Filtering方法
            Filtering(input T) T
        }
        type FilterChain[T any] struct {
            filter Filter[T
            next *FilterChain[T
        }
        /**
           * Go没有类的概念,
           * 主要还是因为Go的研发团队认为Go应当是一门简洁的语言,
           * 因此Go不是一门面向对象的编程语言,或者说不纯粹面向对象,
           * 但Go语言仍然可以像使用类那样使用类似构造函数的工厂函数,
           * 然而Go没法强制用户必须使用工厂函数,因为结构体本身不是类,
           * 为此使用该结构体时,仍然要对该结构体声明的结构体变量进行类型检查
           */
        func FilterChnain[T any](filter Filter[T]) *FilterChain[T] {
            return &FilterChain {
                filter: filter
            }
        }
        func (fc *FilterChain[T any]) SetNext(next *FilterChain[T]) {
            fc.next = next
        }
        func (fc *FilterChain[T any]) Filtering(input T) T{
            /**
               * 与通常的面向对象的编程语言不同,
               * Go不是一个面向对象的语言,
               * 但仍然可以实现接口,
               * 只不过Go语言采用一种隐形实现的机制,
               * 任何结构体,如果定义了该接口所有同名的函数,
               * 编译器在类型检查的时候,会默认这个结构体实现自该接口
               */
            if fc.filter != nil {
                input = fc.filter.Filtering(input)
            }
            if fc.next != nil {
                input = fc.next.Filtering(input)
            }
            return input
                                                                                                                                                                              
    示例:获取一个价格处于60~80元、评分等级不低于4的黑色产品列表
                                                                                                                                                                              
        package main
        import ("fmt")
        type Product struct {
            Price float32
            Brand string
            Color string
            SalesVolume int
            GradingScale int
        }
        type PriceFilter struct {}
        type ColorFilter struct {}
        type GradingScaleFilter struct {}
        func (p *PriceFilter) Filtering(input Product) Product {
            if input.Price >=60 && input.Print <=80 {
                return input
            } else {
                return nil
            }
        }
        func (c *ColorFilter) Filtering(input Product) Product {
            if input.Color == "Black" {
                return input
            } else {
                return nil
            }
        }
        func (gs *GradingScaleFilter) Filtering (input Product) Product {
            if input.GradingScale >= 4 && input.GradingScale <=5{
                return input
            } else {
                return nil
            }
        }
        func main () {
            priceFilter := &PriceFilter{}
            colorFilter := &ColorFilter{}
            gradingScaleFilter := &GradingScaleFilter{}
            filterChain := FilterChain(priceFilter).SetNext(FilterChain(colorFilter)).SetNext(FilterChain(gradingScaleFilter))
            //这里用我手机里的某购物软件的信息
            orginalProducts := []Product{
                {71.5,"某品牌的衣服1","Black",7783,5},
                {80.07,"某品牌的衣服1","Yello",2356,4},
                {29.8,"某品牌的书","Orange",2333,2},
                {6.93,"某品牌的书","Black",4399,4},
                {55.92,"某品牌的衣服2","Yello",8848,5},
                {58,"某品牌的衣服2","Blue",1234,4},
                {17.99,"某垃圾品牌的保健品","Pink",1000000,5},    // 疑似刷的
                {71.59,"某垃圾品牌的矫正器","Green",17000,5},    // 疑似刷的
                {3.18,"某垃圾品牌的牙刷","Red",40000,5},    //疑似刷的
                {3.43,"某垃圾品牌的护肤品","Black",33000,5}    //疑似刷的
            }
            filteredProducts := []Product
            for _, product := range orginalProducts {
                if filterChain.Filtering(product) != nil {
                    filteredProducts = append(filteredProducts, product)
                }
            }
            for _, product := range filteredProducts {
                fmt.Printf("这是一个价格为%.2f,品牌为%s,颜色为%s,销量为%d,评分等级为%d的商品\n", product.Price, product.Brand, product.Color, product.SalesVolume, product.GradingScale)
            }
        }
    回复

    使用道具 举报

    自定义男从Homunculus诺克提斯·路西斯·伽拉姆Forever Titanic钢铁侠永远的克叔【夏日限定】夏日的泰凯斯极·龙の意苏格兰圆脸胖鸡[Pro Max]虚空之海的鲸史莱姆牧场

      轮回2L 发表于 2024-6-6 23:23:58 | 显示全部楼层 <
      好眼熟的功能惹,难怪我的淘宝上都会有一类查找过的东西
      回复

      使用道具 举报

      史莱哲林肉乖乖旧日支配者—克苏鲁業火死鬥魔法不朽·传奇不熄十年一梦炙热的格拉迪欧拉斯卡洛斯·奥利维拉男巫之歌永浴爱河

        Burry 发表于 2024-6-6 23:24:47 | 显示全部楼层 <
        挺详细的科普帖子,就是代码东西有点看不懂。
        回复

        使用道具 举报

        我的天使GM吸血伯爵吃饱金币的Doge苏格兰圆脸胖鸡小小舞台守卫: 坚守眼位永浴爱河肉垫手套御医神兔『搓粉团珠』

          毛茸茸兽兽 发表于 2024-6-6 23:35:10 | 显示全部楼层 <
          万能的隔壁小明()
          喔⊙ω⊙俺老板最近也在和人商量做类似的视频流量推广的事咧
            收起(4)
          回复

          使用道具 举报

          20x43 隐形➀未散的宴席猎户座的明珠缘起星空虚空之海的鲸16x43 隐形➁弗雷迪玩偶发条八音盒16x43 隐形➀

            Riverlethe 发表于 2024-6-6 23:40:58 | 显示全部楼层 <
            有种不详的预感,如果以后做网店还要再学一个编程
            有没有顾客浏览过之后就把钱都给我的程序!!我需要这个!!
              收起(3)
            回复

            使用道具 举报

            史莱姆蛋享受美食的小伯

              Ullnllmll 发表于 2024-6-6 23:44:15 | 显示全部楼层 <
              哇,让我这个目前师从平台方面的人有点受益起来了。话说那个疑似刷的是怎么看出来了,是数据源过多导致的嫌疑嘛。然后这个好像应该是完全由顾客选择的嘛,因为好像是顾客发出请求而后得到结果的,从而使客户快速选定目标从而增加购买率。
                收起(1)
              回复

              使用道具 举报

              弗雷迪玩偶巨力橡果桂花米糕发条八音盒『落樱缤纷』『召唤好运的角笛』『灰域来音』『眼榴』『不败之花』『泥潭颂唱者』

                notunicorna 发表于 2024-6-6 23:48:47 | 显示全部楼层 <
                回复

                使用道具 举报

                龙腾世纪:审判无瑕的回忆贝优妮塔星芒戒指日荒戒指月陨戒指剑指撒冷质量效应三部曲禽兽扒手『冰雕马拉橇』

                  饥渴难耐的G 发表于 2024-6-6 23:50:32 | 显示全部楼层 <
                  回复

                  使用道具 举报

                  弗雷迪玩偶发条八音盒桂花米糕鎏彩万幢女巫之路虚空之海的鲸【新春限定】果体 隆『召唤好运的角笛』永远的克叔業火死鬥

                    娱乐法师火布偶 发表于 2024-6-7 00:11:39 | 显示全部楼层 <
                    Go语言似乎以前完全没有接触过
                      收起(3)
                    回复

                    使用道具 举报

                    虚空之海的鲸『钜鲸』守卫: 坚守眼位御医神兔哀恸魔蝶镜中小鸟孔明灯菀叶狸猫猪庇特小狮欢舞

                      cdcai 发表于 2024-6-7 00:29:03 | 显示全部楼层 <
                      回复

                      使用道具 举报

                      鎏彩万幢近地夜航诺曼底号雄躯的昇格神奇宝贝图鉴『搓粉团珠』永亘环英雄联盟

                        阿睿 发表于 2024-6-7 00:40:31 | 显示全部楼层 <
                        嗯,虽然看不懂代码,但是我想问下这是不是就是每天看到那些垃圾商品的原因啊
                          收起(3)
                        回复

                        使用道具 举报

                        鎏彩万幢传奇都市:天际线2刀锋女王 - 归宿丹妮莉丝·坦格利安官复原职实现梦想丹雀衔五穗,人间始丰登Zootopia最终幻想XVI

                          娱乐伙伴琴键猴 发表于 2024-6-7 00:46:06 | 显示全部楼层 <
                          这样的脚本式的语言比java应该更容易上手
                            收起(3)
                          回复

                          使用道具 举报

                          仇恋桂花米糕我的路从时间蜿蜒而出荣光的残像愤怒的巴哈姆特『狄文卡德的残羽』Dante黑暗之魂系列冒险专用绳索跨过这道墙

                            水水水冘 发表于 2024-6-7 02:10:34 | 显示全部楼层 <
                            回复

                            使用道具 举报

                            红心玉呆猫永亘环龙腾世纪:审判寻觅裸体克里斯近地夜航

                              蕻66666 发表于 2024-6-7 02:23:09 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              命运的轮廓检定场『狄文卡德的残羽』『厢庭望远』万众瞩目『搓粉团珠』神奇宝贝图鉴神奇宝贝大师球雪王的心脏肉垫手套

                                zhuovboyan 发表于 2024-6-7 04:15:46 | 显示全部楼层 <
                                回复

                                使用道具 举报

                                冰海钓竿史莱姆牧场吸血魔蝠萨菲罗斯苏醒的格罗姆圣甲虫秘典可爱黑猫诺克提斯·路西斯·伽拉姆风暴磁场之鳄業火死鬥

                                  圣卫幻梦 发表于 2024-6-7 09:36:54 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  雾都血医人到中年卡洛斯·奥利维拉王者之盾小小安全帽金牌矿工呆猫极·龙の意神奇四叶草

                                    Krampus 发表于 2024-6-7 11:03:17 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    脉律辐石劫掠核芯御医神兔夏日柯基幽灵竹筒黄金树的恩惠探险三杰士图腾饼干生活拍立得璀璨金币

                                      chouki 发表于 2024-6-7 20:35:25 | 显示全部楼层 <
                                      回复

                                      使用道具 举报

                                      牧羊人腐化龙蛋驯化黑龙幼崽瑞雪兆丰年,生灵万物新森林羊男新月护符轻语皮尔斯‧尼凡斯

                                        原初魔鬼 发表于 2024-6-7 23:51:35 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        安德鲁·库珀索尔·奥丁森安德森‧戴维斯走出失恋阴影的罗罗詹米·多南

                                          bigbigbig3 发表于 2024-6-8 22:23:22 | 显示全部楼层 <
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 /1 下一条

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-12-6 07:20 , Processed in 0.149611 second(s), 144 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表