Go语言访客模式实战:让你的代码更灵活高效

文摘   2025-01-29 15:00   四川  

Go语言里头,模式这词听得不少。模式像是解决问题的一把钥匙,设计模式则是程序员桌上不离的工具箱。今天,我们单单聊聊访客模式。这东西有意思,用法巧。不一定在所有场合用得上,但时机对了,像把手伸进手套,合适无比。

先说概念。访客模式说白了,就是你有个结构体,这个结构体里头的数据,它认得一些访客。数据本身不怎么动,但访客能对这些数据进行操作。就像是家中待客,主人静坐一旁,来客自行活动。奇妙之处在这儿,你更新了访客,改变了行为,主人家里的物件自然就跟上变化了。

来看一个简单例子:

go


package main

import"fmt"

// 定义一个结构体
type Owner struct{
    Name string
    Age  int
}

// 定义访客接口
type Visitor interface{
    Visit(*Owner)
}

// 具体访客A
type ConcreteVisitorA struct{}

func(*ConcreteVisitorA)Visit(*Owner){
    o.Age +=1
    fmt.Printf("VisitorA 让 %s 年长了一岁\n", o.Name)
}

// 具体访客B
type ConcreteVisitorB struct{}

func(*ConcreteVisitorB)Visit(*Owner){
    o.Name ="尊敬的"+ o.Name
    fmt.Printf("VisitorB 尊称 %s\n", o.Name)
}

funcmain(){
    owner :=&Owner{Name:"李四", Age:25}

    visitorA :=&ConcreteVisitorA{}
    visitorA.Visit(owner)

    visitorB :=&ConcreteVisitorB{}
    visitorB.Visit(owner)
}

看到没?Owner就是家里那个安静待着的主人,而Visitor像是登门造访的宾客,不同访客来了,状态顿时改变。VisitorA一拜访,主人就增岁,VisitorB一来,主人还被敬称为"尊敬的李四"。就这么简单,不复杂,目的倒很明确。不同的操作落在他身上,生成不同的结果。核心就在于每个访客的Visit方法里自有高招。

应用场景?实际中,比方你在写一个报表程序。每种报表内容需要根据时间段,方式不同处理。也不想总是进入数据体操作对吧?这时候,定义一些特定访客——比如有的把数据拉出来计算总额,有的取出详情汇总展示。处理一块数据时候,一来调用特定的访客,二来按既定的操作完成逻辑。不影响数据体本身稳定性,只关心操作带来的转变。

再品一下,访客模式好似魔术棒,修修这、动动那。不要让它(数据体)本质改动,关键要把挂在外围的那一套改得精准独特。这让程序易扩展,符合开闭原则,该封闭的地方封闭,灵活扩展的由扩展轻易接管。赞吧?将一组操作作用于某些对象上,自己的活不落地,外面只需叫来对应的访客,忙得有条不紊,静静变化。可以想见,格局小的地方不一定感受深刻,一旦进入复杂项目,则是如虎添翼之感。仔细体味,有着刀走游龙的畅快感。看破了这一点,设计模式的各种巧妙往往打开通向更深处的一扇小门。颇有柳暗花明的韵味在里面。

程序的表达最终聊的就是准确的细致,不是热闹的概念。借助模式巧劲儿写出简洁中的深刻况味。


粒粒快点跑
我是粒姐,11年老猎头,职业咨询顾问,曾创立两家猎头公司。 分享求职技巧和职场经验,职业愿景是帮助1000人找到心仪工作。 猎聘签约求职教练,1V1咨询,求职辅导,职业规划咨询,职场辅导。视频号:#粒粒快点跑
 最新文章