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的两 ...
随机推荐
- nltk词性标注
将词汇按它们的词性(parts-of-speech,POS)分类以及相应的标注它们的过程被称为词性标注(part-of-speech tagging, POS tagging)或干脆简称标注.词性也称 ...
- Socket实现简易聊天室,Client,Server
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...
- Make a List View Editable 使列表视图可编辑
In this lesson, you will learn how to make a List View editable. For this purpose, the DemoTask List ...
- Angular-----代码风格指南!!!(很重要)
一:文件结构 1).单一规则:坚持每个文件只定义一样东西(例如服务或组件),考虑把文件大小限制在 400 行代码以内. 单组件文件非常容易阅读.维护,并能防止在版本控制系统里与团队冲突: 单组件文件可 ...
- HTML+CSS基础知识点简要汇总(思维导图)
- dpwwn:2 Vulnhub Walkthrough
此镜像配置了静态IP地址:10.10.10.10,需要调整下网络 主机层扫描: ╰─ nmap -p1-65535 -sV -A 10.10.10.10 80/tcp open http ...
- Python Exception处理
Python中的错误处理分为两类:语法错误和异常处理.语法错误一般是指由于python语句.表达式.函数等存在书写格式活语法规则上的错误抛出的异常,如python常见的缩进控制,若同层次的执行语句存在 ...
- Saltstack_使用指南09_远程执行-编写执行模块
1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...
- NumPy 会自动检测并利用 GPU 吗?
PyTorch 官网 60 分钟入门教程在介绍什么是 PyTorch 时有一句话:A replacement for NumPy to use the power of GPUs PyTorch 是 ...
- IT兄弟连 HTML5教程 HTML5的基本语法 小结及习题
小结 一个完整的HTML文件由标题.段落.列表.表格.文本,即嵌入的各种对象所组成,这些逻辑上统一的对象称为元素.HTML文档主体结构分为两部分,一部分是定义文档类型,另一部分则是定义文档主体的结构框 ...