《golang设计模式》第二部分·结构型模式-02-桥接模式(Bridge)

文章目录

  • [1. 概念](#1. 概念)
    • [1.1 角色](#1.1 角色)
    • [1.2 类图](#1.2 类图)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 设计](#2.1 设计)
    • [2.1 代码](#2.1 代码)
    • [2.2 类图](#2.2 类图)

1. 概念

客户端调用桥接接口实现原有功能和扩展功能的组合

1.1 角色

  • Implementor(实施者):
    • 具体实施者的抽象,可以是一个接口。
  • Concrete Implementor(具体实施者):
    • 可以理解为扩展之前的原有功能
    • 桥接接口会在实现扩展功能的基础上调用它实现这些原有功能
  • Abstraction(抽象化):
    • 我们可以理解为桥接接口,它在提供扩展功能的同时也桥接了原有功能的接口
    • Refined Abstraction提供一个统一接口
    • 它关联了Implementor(或者进一步是Implementor的聚合)
  • Refined Abstraction(扩展抽象化):
    • 可以理解为它实现了具体的扩展功能,并实际调用了mplementor接口完成了原有功能

1.2 类图

<<interface>> Implementor +serviceImpl() : ReturnType ConcreteImplementor +serviceImpl() : ReturnType +customService() : Type <<interface>> Abstraction +Implementor:Implementor +abstractService() RefinedAbstraction +extraService() Client

2. 代码示例

2.1 设计

  • 定义一个实施者颜色
  • 定义三个具体实施者红色绿色黄色
    • 他们的use()方法来实现使用对应颜色
  • 定义一个抽象化类(桥接接口)笔刷
  • 定义两个扩展抽象化类粗笔刷细笔刷
    • 他们的画画方法
      • 实现扩展功能------用对应笔刷画画
      • 同时调用实施者接口,实现了对应的颜色功能
  • 定义一个工厂函数用来实例化一个具体的笔刷
  • 调用
    • 声明一个实施者
    • 实例化一个具体实施者
    • 用具体实施者实例化一个桥接
    • 调用桥接的方法实现原有功能和扩展功能的组合

2.1 代码

go 复制代码
package main

import "fmt"

//定义实施者类
type Color interface {
	Use()
}

//定义具体实施者A
type Red struct{}

func (r Red) Use() {
	fmt.Println("Use Red color")
}
//定义具体实施者B
type Green struct{}

func (g Green) Use() {
	fmt.Println("Use Green color")
}
//定义具体实施者C
type Yellow struct{}

func (y Yellow) Use() {
	fmt.Println("Use Yellow color")
}

// 定义抽象化类(或叫桥接接口)
type BrushPen interface {
	DrawPicture()
}

// 定义扩展抽象化A
type BigBrushPen struct {
	Color
}

//提供扩展功能,同时选择原功能执行
func (bbp BigBrushPen) DrawPicture() {
	fmt.Println("Draw picture with big brush pen")
	bbp.Use()
}

// 定义扩展抽象化B
type SmallBrushPen struct {
	Color
}
//提供扩展功能,同时选择原功能执行
func (sbp SmallBrushPen) DrawPicture() {
	fmt.Println("Draw picture with small brush pen")
	sbp.Use()
}

// 定义工厂方法生产具体的扩展抽象化(此处为了方便展示,和桥接模式无关)
func NewBrushPen(t string, color Color) BrushPen {
	switch t {
	case "BIG":
		return BigBrushPen{
			Color: color,
		}
	case "SMALL":
		return SmallBrushPen{
			Color: color,
		}
	default:
		return nil
	}
}

func main() {
    //声明实施者
	var tColor Color
	fmt.Println("========== 第一次测试 ==========")
	//定义为具体实施者
	tColor = Red{}
	//用具体实施者实例化一个抽象化
	tBrushPen := NewBrushPen("BIG", tColor)
	//用抽象化的画画功能完成扩展功能(粗细笔刷)和对应原功能(颜色)的组合操作
	tBrushPen.DrawPicture()
	fmt.Println("========== 第二次测试 ==========")
	tColor = Green{}
	tBrushPen = NewBrushPen("SMALL", tColor)
	tBrushPen.DrawPicture()
	fmt.Println("========== 第三次测试 ==========")
	tColor = Yellow{}
	tBrushPen = NewBrushPen("BIG", tColor)
	tBrushPen.DrawPicture()
}
  • 输出
shell 复制代码
========== 第一次测试 ==========
Draw picture with big brush pen  
Use Red color
========== 第二次测试 ========== 
Draw picture with small brush pen
Use Green color
========== 第三次测试 ========== 
Draw picture with big brush pen  
Use Yellow color

2.2 类图

<<interface>> Color +Use() Red +Use() Green +Use() Yellow +Use() <<interface>> BrushPen +DrawPicture() BigBrushPen +Color +DrawPicture() SmallBrushPen +Color +DrawPicture() Client

相关推荐
ac.char18 分钟前
Golang读取ZIP压缩包并显示Gin静态html网站
golang·html·gin
GodKeyNet1 小时前
设计模式-责任链模式
java·设计模式·责任链模式
Cxzzzzzzzzzz2 小时前
.golangci.yml文件配置
golang
摘星编程6 小时前
深入理解责任链模式:从HTTP中间件到异常处理的实战应用
http·设计模式·中间件·责任链模式·实战应用
鼠鼠我呀28 小时前
【设计模式04】单例模式
单例模式·设计模式
缘来是庄17 小时前
设计模式之访问者模式
java·设计模式·访问者模式
hqxstudying19 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
花好月圆春祺夏安20 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
fie888920 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
哆啦A梦的口袋呀20 小时前
《深入设计模式》模式结构汇总
设计模式