go语言设计模式之bridge
著名的桥接模式罗。。
bridge.go
package bridge import ( "errors" "fmt" "io" ) type PrinterAPI interface { PrintMessage(string) error } type PrinterImpl1 struct{} func (p *PrinterImpl1) PrintMessage(msg string) error { fmt.Printf("%s\n", msg) return nil //return errors.New("Not implemented yet") } type PrinterImpl2 struct { Writer io.Writer } func (d *PrinterImpl2) PrintMessage(msg string) error { if d.Writer == nil { return errors.New("You need to pass an io.Writer to PrinterImpl2") } fmt.Fprintf(d.Writer, "%s", msg) return nil //return errors.New("Not implemented yet") } type TestWriter struct { Msg string } func (t *TestWriter) Write(p []byte) (n int, err error) { n = len(p) if n > 0 { t.Msg = string(p) return n, nil } err = errors.New("Content received on Writer was empty") return } type PrinterAbstraction interface { Print() error } type NormalPrinter struct { Msg string Printer PrinterAPI } func (c *NormalPrinter) Print() error { c.Printer.PrintMessage(c.Msg) return nil //return errors.New("Not implemented yet") } type PacktPrinter struct { Msg string Printer PrinterAPI } func (c *PacktPrinter) Print() error { c.Printer.PrintMessage(fmt.Sprintf("Message from Packt: %s", c.Msg)) return nil //return errors.New("Not implemented yet") }
bridge_test.go
package bridge import ( //"strings" "testing" ) func TestPrintAPI1(t *testing.T) { api1 := PrinterImpl1{} err := api1.PrintMessage("Hello") if err != nil { t.Errorf("Error trying to use the API1 implementation: Message: %s\n", err.Error()) } } func TestPrintAPI2(t *testing.T) { testWriter := TestWriter{} api2 := PrinterImpl2{ Writer: &testWriter, } expectedMessage := "Hello" err := api2.PrintMessage(expectedMessage) if err != nil { t.Errorf("Error trying to use the API2 implementation: %s\n", err.Error()) if testWriter.Msg != expectedMessage { t.Fatalf("API2 io.writer wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage) } } } func TestNormalPrinter_Print(t *testing.T) { expectedMessage := "Hello io.Writer" normal := NormalPrinter{ Msg: expectedMessage, Printer: &PrinterImpl1{}, } err := normal.Print() if err != nil { t.Errorf(err.Error()) } testWriter := TestWriter{} normal = NormalPrinter{ Msg: expectedMessage, Printer: &PrinterImpl2{ Writer: &testWriter, }, } err = normal.Print() if err != nil { t.Errorf(err.Error()) } if testWriter.Msg != expectedMessage { t.Errorf("The expected message on the io.Writer is wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage) } } func TestPacktPrinter_Print(t *testing.T) { passedMessage := "Hello io.Writer" expectedMessage := "Message from Packt: Hello io.Writer" packt := PacktPrinter{ Msg: passedMessage, Printer: &PrinterImpl1{}, } err := packt.Print() if err != nil { t.Errorf(err.Error()) } testWriter := TestWriter{} packt = PacktPrinter{ Msg: passedMessage, Printer: &PrinterImpl2{ Writer: &testWriter, }, } err = packt.Print() if err != nil { t.Errorf(err.Error()) } if testWriter.Msg != expectedMessage { t.Errorf("The expected message on the io.Writer is wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage) } }
go语言设计模式之bridge的更多相关文章
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- [学习笔记]设计模式之Bridge
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...
- 【设计模式】Bridge模式(桥接模式)
最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 设计模式之——bridge模式
Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式. 这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧. 首先,我们要了解到,为什么需 ...
- Go语言设计模式实践:迭代器(Iterator)
关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...
- Go语言设计模式实践:组合(Composite)
关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...
- 【设计模式】Bridge
前言 Bridge设计模式,将一个复杂类分成可以单独开发的部分.分成的两个部分,abstraction,implementation.字面上是抽象和实现,但不同于抽象方法及其实现.下面摘录Wiki的两 ...
随机推荐
- IT兄弟连 HTML5教程 CSS3属性特效 3D变换2
3 perspective-origin景深基点 perspective-origin景深基点属性时3D变形中另一个重要属性,主要用来决定perspective属性的源点角度.它实际上设置了X轴和Y ...
- Python 和 JS 有什么相似?
Python 是一门运用很广泛的语言,自动化脚本.爬虫,甚至在深度学习领域也都有 Python 的身影.作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数.解构赋值. ...
- 用python重新定义【2019十大网络流行语】
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:朱小五 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- JS Navigator
JS Navigator window.navigator 对象包含有关访问者浏览器的信息. Window Navigator window.navigator 对象在编写时可不使用 window 这 ...
- Android8.1 SystemUI源码分析之 电池时钟刷新
SystemUI源码分析相关文章 Android8.1 SystemUI源码分析之 Notification流程 分析之前再贴一下 StatusBar 相关类图 电池图标刷新 从上篇的分析得到电池图标 ...
- color颜色大全
- Cocos2d-x项目编译为Android应用——命令行方式
配置: 相关工具:Cocos2d-x 3.2 + Ant 1.9.4 + Android NDK r9d + Android SDK 运行平台:OS X 10.9.4+ Xcode 6 前言:笔者使用 ...
- day99_12_3numpy的索引以及pandas的两个数据结构。
一.索引与切片. nump的索引和python中的索引差不多,都是左开右闭区间. 如一个普通的array的索引,是由0开始的: res = np.array([1,2,3,4,5]) #### npa ...
- SpringCloud gateway (史上最全)
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
- Ruby入门1
由于部门的自动化是由一个前辈实现的,他使用的Ruby的语言来实现的,所以需要学习一下Ruby语言,争取在15天左右可以掌握Ruby语言!加油~~~ 1.常量&变量 # 1.常量 # 一般用大写 ...