go语言设计模式之visitor
2024-08-31 22:19:42
这个确实没有调通,也要记录一下
visitor.go
package visitor import ( "fmt" "io" "os" ) type MessageA struct { Msg string Output io.Writer } func (m *MessageA) Accept(v Visitor) { //nothing v.VisitA(m) } func (m *MessageA) Print() { //nothing if m.Output == nil { m.Output = os.Stdout } fmt.Printf("A: %s\n", m.Msg) fmt.Fprintf(m.Output, "A: %s", m.Msg) } type MessageB struct { Msg string Output io.Writer } func (m *MessageB) Accept(v Visitor) { //nothing v.VisitB(m) } func (m *MessageB) Print() { //nothing if m.Output == nil { m.Output = os.Stdout } fmt.Printf("B: %s\n", m.Msg) fmt.Fprintf(m.Output, "B: %s", m.Msg) } type Visitor interface { VisitA(*MessageA) VisitB(*MessageB) } type Visitable interface { Accept(Visitor) } type MessageVisitor struct{} func (mf *MessageVisitor) VisitA(m *MessageA) { //nothing m.Msg = fmt.Sprintf("%s %s", m.Msg, "(Visited A)") } func (mf *MessageVisitor) VisitB(m *MessageB) { //nothing m.Msg = fmt.Sprintf("%s %s", m.Msg, "(Visited B)") }
visitor_test.go
package visitor import ( "fmt" "testing" ) type TestHelper struct { Received string } func (t TestHelper) Write(p []byte) (int, error) { t.Received = string(p) return len(p), nil } func Test_Overall(t *testing.T) { testHelper := &TestHelper{} visitor := &MessageVisitor{} t.Run("MessageA test", func(t *testing.T) { msg := MessageA{ Msg: "Hello World", Output: testHelper, } msg.Accept(visitor) msg.Print() fmt.Print(testHelper) expected := "A: Hello World (Visited A)" if testHelper.Received != expected { t.Errorf("Expected result was incorrect. %s != %s", testHelper.Received, expected) } }) t.Run("MessageB test", func(t *testing.T) { msg := MessageB{ Msg: "Hello World", Output: testHelper, } msg.Accept(visitor) msg.Print() expected := "B: Hello World (Visited B)" if testHelper.Received != expected { t.Errorf("Expected result was incorrect. %s != %s", testHelper.Received, expected) } }) }
最新文章
- javascript对象继承详解
- 《Linux内核设计与实现》读书笔记(十九)- 可移植性
- poj 1273 Drainage Ditches 最大流入门题
- 04day2
- iOS获取webview高度
- Struts2+JFreeChart
- HDU 5139数据离线处理
- poj 1715 Hexadecimal Numbers 排列组合
- svn笔记2
- 内网穿透神器ngrok(转)
- BZOJ2064: 分裂
- Django中的许可(Permissions)和用户组(Group)
- JDBC进阶
- 关于C/S框架网单表绑定,查询
- Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
- 安装rcssmin方法
- zabbix 官方文档
- SQLI DUMB SERIES-1
- android手机截屏、录屏
- cocos2d-x 3.0 在lua中调用自定义类
热门文章
- MTDDL 美团分布式数据访问中间件(转)
- How to: Use the Entity Framework Data Model Located in an External Assembly 如何:使用位于外部程序集中的EF数据模型
- 一个神奇的HTML标签-----marquee
- Cocos2d-x.3.0开发环境搭建之—— 极简式环境搭建
- 【西北师大-2108Java】第十二次作业成绩汇总
- 多线程编程学习七( Fork/Join 框架).
- ABP之Logging
- ASP.NET Core - 基于IHttpContextAccessor实现系统级别身份标识
- GO基础之切片
- flutter全栈开发学习资料大全 免费flutter学习视频 文字教程!