【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) } } 好眼熟的功能惹,难怪我的淘宝上都会有一类查找过的东西{:6_169:} 挺详细的科普帖子,就是代码东西有点看不懂。 万能的隔壁小明()
喔⊙ω⊙俺老板最近也在和人商量做类似的视频流量推广的事咧 有种不详的预感,如果以后做网店还要再学一个编程{:6_199:}
有没有顾客浏览过之后就把钱都给我的程序!!我需要这个!! :o哇,让我这个目前师从平台方面的人有点受益起来了。话说那个疑似刷的是怎么看出来了,是数据源过多导致的嫌疑嘛。然后这个好像应该是完全由顾客选择的嘛,因为好像是顾客发出请求而后得到结果的,从而使客户快速选定目标从而增加购买率。 这份代码要怎么运行呀 所以,这个东西其实类似于大数据? Go语言似乎以前完全没有接触过 完全不懂代码,看完科普还是不知道做什么的{:6_167:} 嗯,虽然看不懂代码,但是我想问下这是不是就是每天看到那些垃圾商品的原因啊 这样的脚本式的语言比java应该更容易上手 又是学到新的知识了 坛里佬好多,又学到一点新东西 0-0 今天也是涨知识的一天 小白一脸懵逼jpg 完全没有接触到过go语言,之后有空去了解一下这个语言对大数据的处理怎么样 感觉看上去像是大数据推荐(完全看不懂) 看楼上面的发言,也都是代码小白,我不是很孤单{:6_197:} 看得我一脸懵逼,好高大上 好专业啊
泥潭处处是高人
页:
[1]
2