GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 848|回复: 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)
            }
        }
    回复

    使用道具 举报

    诺克提斯·路西斯·伽拉姆Forever Titanic業火死鬥钢铁侠永远的克叔极·龙の意死灵之书卡利亚权杖虚空之海的鲸史莱姆牧场

      好眼熟的功能惹,难怪我的淘宝上都会有一类查找过的东西
      回复

      使用道具 举报

      实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌永浴爱河虚空之海的鲸

        挺详细的科普帖子,就是代码东西有点看不懂。
        回复

        使用道具 举报

        我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯和你一起飞行的皮卡丘小小舞台永浴爱河

          万能的隔壁小明()
          喔⊙ω⊙俺老板最近也在和人商量做类似的视频流量推广的事咧
            收起(4)
          回复

          使用道具 举报

          希尔瓦娜斯·风行者麦迪文(Medivh)阿尔萨斯‧米奈希尔创生之柱卡德加(Khadgar)安杜因·乌瑞恩我的天使夏日柯基幸福的小阿尔吃饱金币的Doge

            有种不详的预感,如果以后做网店还要再学一个编程
            有没有顾客浏览过之后就把钱都给我的程序!!我需要这个!!
              收起(3)
            回复

            使用道具 举报

            荒野大镖客:救赎 II史莱姆蛋享受美食的小伯

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

              使用道具 举报

              灵光补脑剂无瑕的回忆朴素的誓言『住在GM村』没有梦想的咸鱼小丑与格雷与星光璀璨『落樱缤纷』『灰域来音』『眼榴』『钟楼盐水棒冰』

                回复

                使用道具 举报

                『住在GM村』珊瑚泡泡鱼不曾寄出的信件小小安全帽魔眼护符骑兽之子近地夜航元气菠菜人烈焰天使弓龙血指环

                  回复

                  使用道具 举报

                  百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

                    Go语言似乎以前完全没有接触过
                      收起(3)
                    回复

                    使用道具 举报

                    虚空之海的鲸『私有海域』『钜鲸』『星河碎片』『召唤好运的角笛』『交钥匙了!』『矩阵谜钥Ⓖ』十周年扭蛋 - 红『落樱缤纷』红心玉

                      回复

                      使用道具 举报

                      幽光蓝龙青鸾神奇四叶草近地夜航变身器生活拍立得圣甲虫秘典

                        嗯,虽然看不懂代码,但是我想问下这是不是就是每天看到那些垃圾商品的原因啊
                          收起(3)
                        回复

                        使用道具 举报

                        石鬼面小丑与格雷与星光璀璨岛田半藏岛田源氏刀锋女王 - 归宿丹妮莉丝·坦格利安官复原职实现梦想瑞雪兆丰年,生灵万物新

                          这样的脚本式的语言比java应该更容易上手
                            收起(3)
                          回复

                          使用道具 举报

                          『钟楼盐水棒冰』小小安全帽Forever Titanic神人的编制发无尽的怀表冒险专用绳索金牌矿工御医神兔幸运女神的微笑『逆境中的幸运女神』

                            回复

                            使用道具 举报

                            红心玉特殊-家园卫士Ⓛ特殊-家园卫士Ⓡ雄躯的昇格TRPG版塊近地夜航

                              回复

                              使用道具 举报

                              『住在GM村』格拉迪欧拉斯雪王的心脏『星河碎片』『灰域来音』预知水晶球炽天使之拥『伊黎丝的赞词』纯真护剑『随时随地开启!』

                                回复

                                使用道具 举报

                                史莱姆牧场吸血魔蝠萨菲罗斯苏醒的格罗姆圣甲虫秘典可爱黑猫诺克提斯·路西斯·伽拉姆夏日柯基美恐:新的开始

                                  回复

                                  使用道具 举报

                                  雾都血医人到中年卡洛斯·奥利维拉王者之盾小小安全帽金牌矿工『伊黎丝的赞词』极·龙の意神奇四叶草

                                    回复

                                    使用道具 举报

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

                                      回复

                                      使用道具 举报

                                      牧羊人幼年独角兽驯化红龙幼崽腐化龙蛋黑龙幼崽瑞雪兆丰年,生灵万物新森林羊男新月护符

                                        回复

                                        使用道具 举报

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

                                          回复

                                          使用道具 举报

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

                                          本版积分规则

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

                                          GMT+8, 2024-12-22 13:52 , Processed in 0.209088 second(s), 143 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表