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的两 ...
随机推荐
- C# 32位程序 申请大内存
后期生成事件命令行代码: cd /d $(DevEnvDir)cd..cd..cd VC\bineditbin /largeaddressaware $(TargetPath)
- postgreSQL安装教程 Windows
Windows 上安装 PostgreSQL 这里使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商. 下载地址 ...
- idea中git分支、合并与使用
1.分支的新建与合并使用场景介绍 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求.问题(#53问题),创建一 ...
- MySQL 学习笔记 (一)
1.InnoDB and Online DDL ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ...
- Python—定时任务(APScheduler实现)
简介 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的基于Quartz的 Python 定时任务调度框架.APSche ...
- Win10锁屏壁纸位置
C:\Users\MIS\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalStat ...
- 菜鸟刷面试题(一、Java基础篇)
目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...
- JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程
壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...
- C++入门到理解阶段二基础篇(8)——C++指针
1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...
- Luogu P1583 魔法照片
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...