白冥 发表于 2024-6-6 23:14:17

【Go语言】利用责任链模式构造过滤链

本帖最后由 白冥 于 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)      }    }

轮回2L 发表于 2024-6-6 23:23:58

好眼熟的功能惹,难怪我的淘宝上都会有一类查找过的东西{:6_169:}

Burry 发表于 2024-6-6 23:24:47

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

毛茸茸兽兽 发表于 2024-6-6 23:35:10

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

Riverlethe 发表于 2024-6-6 23:40:58

有种不详的预感,如果以后做网店还要再学一个编程{:6_199:}
有没有顾客浏览过之后就把钱都给我的程序!!我需要这个!!

Ullnllmll 发表于 2024-6-6 23:44:15

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

feng1997817 发表于 2024-6-6 23:48:47

这份代码要怎么运行呀

饥渴难耐的G 发表于 2024-6-6 23:50:32

所以,这个东西其实类似于大数据?

娱乐法师火布偶 发表于 2024-6-7 00:11:39

Go语言似乎以前完全没有接触过

cdcai 发表于 2024-6-7 00:29:03

完全不懂代码,看完科普还是不知道做什么的{:6_167:}

阿睿 发表于 2024-6-7 00:40:31

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

娱乐伙伴琴键猴 发表于 2024-6-7 00:46:06

这样的脚本式的语言比java应该更容易上手

水水水冘 发表于 2024-6-7 02:10:34

又是学到新的知识了

蕻66666 发表于 2024-6-7 02:23:09

坛里佬好多,又学到一点新东西

zhuovboyan 发表于 2024-6-7 04:15:46

0-0 今天也是涨知识的一天 小白一脸懵逼jpg

圣卫幻梦 发表于 2024-6-7 09:36:54

完全没有接触到过go语言,之后有空去了解一下这个语言对大数据的处理怎么样

Krampus 发表于 2024-6-7 11:03:17

感觉看上去像是大数据推荐(完全看不懂)

chouki 发表于 2024-6-7 20:35:25

看楼上面的发言,也都是代码小白,我不是很孤单{:6_197:}

原初魔鬼 发表于 2024-6-7 23:51:35

看得我一脸懵逼,好高大上

bigbigbig3 发表于 2024-6-8 22:23:22

好专业啊
泥潭处处是高人
页: [1] 2
查看完整版本: 【Go语言】利用责任链模式构造过滤链