著名的桥接模式罗。。

bridge.go

  1. package bridge
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. "io"
  7. )
  8.  
  9. type PrinterAPI interface {
  10. PrintMessage(string) error
  11. }
  12.  
  13. type PrinterImpl1 struct{}
  14.  
  15. func (p *PrinterImpl1) PrintMessage(msg string) error {
  16. fmt.Printf("%s\n", msg)
  17. return nil
  18. //return errors.New("Not implemented yet")
  19. }
  20.  
  21. type PrinterImpl2 struct {
  22. Writer io.Writer
  23. }
  24.  
  25. func (d *PrinterImpl2) PrintMessage(msg string) error {
  26. if d.Writer == nil {
  27. return errors.New("You need to pass an io.Writer to PrinterImpl2")
  28. }
  29. fmt.Fprintf(d.Writer, "%s", msg)
  30. return nil
  31. //return errors.New("Not implemented yet")
  32. }
  33.  
  34. type TestWriter struct {
  35. Msg string
  36. }
  37.  
  38. func (t *TestWriter) Write(p []byte) (n int, err error) {
  39. n = len(p)
  40. if n > 0 {
  41. t.Msg = string(p)
  42. return n, nil
  43. }
  44. err = errors.New("Content received on Writer was empty")
  45. return
  46. }
  47.  
  48. type PrinterAbstraction interface {
  49. Print() error
  50. }
  51.  
  52. type NormalPrinter struct {
  53. Msg string
  54. Printer PrinterAPI
  55. }
  56.  
  57. func (c *NormalPrinter) Print() error {
  58. c.Printer.PrintMessage(c.Msg)
  59. return nil
  60. //return errors.New("Not implemented yet")
  61. }
  62.  
  63. type PacktPrinter struct {
  64. Msg string
  65. Printer PrinterAPI
  66. }
  67.  
  68. func (c *PacktPrinter) Print() error {
  69. c.Printer.PrintMessage(fmt.Sprintf("Message from Packt: %s", c.Msg))
  70. return nil
  71. //return errors.New("Not implemented yet")
  72. }

  

bridge_test.go

  1. package bridge
  2.  
  3. import (
  4. //"strings"
  5. "testing"
  6. )
  7.  
  8. func TestPrintAPI1(t *testing.T) {
  9. api1 := PrinterImpl1{}
  10. err := api1.PrintMessage("Hello")
  11. if err != nil {
  12. t.Errorf("Error trying to use the API1 implementation: Message: %s\n", err.Error())
  13. }
  14. }
  15.  
  16. func TestPrintAPI2(t *testing.T) {
  17. testWriter := TestWriter{}
  18. api2 := PrinterImpl2{
  19. Writer: &testWriter,
  20. }
  21. expectedMessage := "Hello"
  22. err := api2.PrintMessage(expectedMessage)
  23. if err != nil {
  24. t.Errorf("Error trying to use the API2 implementation: %s\n", err.Error())
  25.  
  26. if testWriter.Msg != expectedMessage {
  27. t.Fatalf("API2 io.writer wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage)
  28. }
  29.  
  30. }
  31. }
  32.  
  33. func TestNormalPrinter_Print(t *testing.T) {
  34. expectedMessage := "Hello io.Writer"
  35. normal := NormalPrinter{
  36. Msg: expectedMessage,
  37. Printer: &PrinterImpl1{},
  38. }
  39.  
  40. err := normal.Print()
  41. if err != nil {
  42. t.Errorf(err.Error())
  43. }
  44.  
  45. testWriter := TestWriter{}
  46. normal = NormalPrinter{
  47. Msg: expectedMessage,
  48. Printer: &PrinterImpl2{
  49. Writer: &testWriter,
  50. },
  51. }
  52.  
  53. err = normal.Print()
  54. if err != nil {
  55. t.Errorf(err.Error())
  56. }
  57.  
  58. if testWriter.Msg != expectedMessage {
  59. t.Errorf("The expected message on the io.Writer is wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage)
  60. }
  61.  
  62. }
  63.  
  64. func TestPacktPrinter_Print(t *testing.T) {
  65. passedMessage := "Hello io.Writer"
  66. expectedMessage := "Message from Packt: Hello io.Writer"
  67. packt := PacktPrinter{
  68. Msg: passedMessage,
  69. Printer: &PrinterImpl1{},
  70. }
  71.  
  72. err := packt.Print()
  73. if err != nil {
  74. t.Errorf(err.Error())
  75. }
  76.  
  77. testWriter := TestWriter{}
  78. packt = PacktPrinter{
  79. Msg: passedMessage,
  80. Printer: &PrinterImpl2{
  81. Writer: &testWriter,
  82. },
  83. }
  84.  
  85. err = packt.Print()
  86. if err != nil {
  87. t.Errorf(err.Error())
  88. }
  89.  
  90. if testWriter.Msg != expectedMessage {
  91. t.Errorf("The expected message on the io.Writer is wrong.\n Actual: %s\nExpected: %s\n", testWriter.Msg, expectedMessage)
  92. }
  93.  
  94. }

  

go语言设计模式之bridge的更多相关文章

  1. Go语言设计模式之函数式选项模式

    Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...

  2. Go语言设计模式汇总

    目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...

  3. [学习笔记]设计模式之Bridge

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...

  4. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  5. C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  6. 设计模式之——bridge模式

    Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式. 这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧. 首先,我们要了解到,为什么需 ...

  7. Go语言设计模式实践:迭代器(Iterator)

    关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...

  8. Go语言设计模式实践:组合(Composite)

    关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...

  9. 【设计模式】Bridge

    前言 Bridge设计模式,将一个复杂类分成可以单独开发的部分.分成的两个部分,abstraction,implementation.字面上是抽象和实现,但不同于抽象方法及其实现.下面摘录Wiki的两 ...

随机推荐

  1. C# 32位程序 申请大内存

    后期生成事件命令行代码: cd /d $(DevEnvDir)cd..cd..cd VC\bineditbin /largeaddressaware $(TargetPath)

  2. postgreSQL安装教程 Windows

    Windows 上安装 PostgreSQL 这里使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商. 下载地址 ...

  3. idea中git分支、合并与使用

    1.分支的新建与合并使用场景介绍 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求.问题(#53问题),创建一 ...

  4. MySQL 学习笔记 (一)

    1.InnoDB and Online DDL ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ...

  5. Python—定时任务(APScheduler实现)

    简介                 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的基于Quartz的 Python 定时任务调度框架.APSche ...

  6. Win10锁屏壁纸位置

    C:\Users\MIS\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalStat ...

  7. 菜鸟刷面试题(一、Java基础篇)

    目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...

  8. JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程

     壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...

  9. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

  10. Luogu P1583 魔法照片

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...