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的两 ...
随机推荐
- java8-Optional的引入
背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛. 1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计. 一个例子 业务模型 Perso ...
- Cross-Site Scripting:DOM 跨站点脚本:DOM
- sklearn集成支持向量机svm.SVC参数说明
经常用到sklearn中的SVC函数,这里把文档中的参数翻译了一些,以备不时之需. 本身这个函数也是基于libsvm实现的,所以在参数设置上有很多相似的地方.(PS: libsvm中的二次规划问题的解 ...
- Linux创建Jenkins启动脚本以及开机启动服务
1.jenkins.sh #!/bin/bash ###主要目的用于开机启动服务,不然 启动jenkins.war包没有java -jar的权限 JAVA_HOME=/usr/lib/jdk1.8.0 ...
- 通过传XML格式导入到ORACLE的销售订单
procedure IMPORT_OM(p_unid varchar2, --流程ID p_CUSTOMER_PO varchar2, --合同编号 p_xmlstr varchar2, --clob ...
- Android微信九宫格图片展示控件
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...
- Python通过pymysql连接数据库并进行查询和更新SQL方法封装
1.通过pymysql连接数据库并进行数据库操作2.查询数据3.更新修改SQL方法封装 import pymysql.cursors import json class OperationMysql: ...
- 查看/运行jpynb文件
Windows OS:安装好pip包,能使用pip进行安装第三方包. cmd命令行: pip install jupyter jupyter notebook cd (xx.jpynb文件所在文件夹) ...
- 浮点运算与boost.multiprecision
在C++中,float占4个字节,double占8个字节,均采用 IEEE 754 浮点标准:内部都是以二进制为基础,表述实数,有些实数可以被精确表述,比如0.2,但有些不行,比如0.3.针对这一点, ...
- mysql分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
环境:Server version: 5.7.27-0 ubuntu 18.04.1 (Ubuntu) 执行分组语句:select * from pet group by owner;时报错: mys ...