这个确实没有调通,也要记录一下

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)
		}
	})
}

  

最新文章

  1. javascript对象继承详解
  2. 《Linux内核设计与实现》读书笔记(十九)- 可移植性
  3. poj 1273 Drainage Ditches 最大流入门题
  4. 04day2
  5. iOS获取webview高度
  6. Struts2+JFreeChart
  7. HDU 5139数据离线处理
  8. poj 1715 Hexadecimal Numbers 排列组合
  9. svn笔记2
  10. 内网穿透神器ngrok(转)
  11. BZOJ2064: 分裂
  12. Django中的许可(Permissions)和用户组(Group)
  13. JDBC进阶
  14. 关于C/S框架网单表绑定,查询
  15. Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
  16. 安装rcssmin方法
  17. zabbix 官方文档
  18. SQLI DUMB SERIES-1
  19. android手机截屏、录屏
  20. cocos2d-x 3.0 在lua中调用自定义类

热门文章

  1. MTDDL 美团分布式数据访问中间件(转)
  2. How to: Use the Entity Framework Data Model Located in an External Assembly 如何:使用位于外部程序集中的EF数据模型
  3. 一个神奇的HTML标签-----marquee
  4. Cocos2d-x.3.0开发环境搭建之—— 极简式环境搭建
  5. 【西北师大-2108Java】第十二次作业成绩汇总
  6. 多线程编程学习七( Fork/Join 框架).
  7. ABP之Logging
  8. ASP.NET Core - 基于IHttpContextAccessor实现系统级别身份标识
  9. GO基础之切片
  10. flutter全栈开发学习资料大全 免费flutter学习视频 文字教程!