《golang設計模式》第二部分·結構型模式-02-橋接模式(Bridge)

文章目錄

  • 1. 概念
    • 1.1 角色
    • 1.2 類圖
  • 2. 代碼示例
    • 2.1 設計
    • 2.1 代碼
    • 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 代碼

package mainimport "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 Colorfmt.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()
}
  • 輸出
========== 第一次測試 ==========
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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37165.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8.15號經典模型復習筆記

文章目錄 Deep Residual Learning for Image Recognition(CVPR2016)方法 Densely Connected Convolutional Networks(CVPR2017)方法 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(ICML2019)方法 Re…

使用維納過濾器消除駕駛艙噪音(Matlab代碼實現)

💥💥💞💞歡迎來到本博客????💥💥 🏆博主優勢:🌞🌞🌞博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ??座右銘&a…

信息論、推理和機器學習算法之間交叉的經典例子

信息論、推理和機器學習算法之間交叉的經典例子: 熵和信息增益在決策樹學習中的應用。信息增益利用熵的概念來評估特征的分類能力,從而指導決策樹的增長。 交叉熵在神經網絡訓練中的廣泛使用。它結合信息論與最大似然推斷,用于度量預測分布與真實分布之間的距離。 變分推斷常被…

Tomcat的多實例和動靜分離

目錄 一、多實例 二、 nginxtomcat的負載均衡和動靜分離 三、Tomcat 客戶端->四層代理->七層代理->tomcat服務器 實驗: 問題總結: tomcat日志文件:/usr/local/tomcat/logs/catalina.out 一、多實例 在一臺服務器上有多個tomc…

微信小程序(原生)和uniapp預覽電子文件doc/pdf/ppt/excel等

微信小程序原生預覽文件 function previewFile(value) {const fileExtName ${value.ext};const randFile new Date().getTime() fileExtName;uni.showLoading({title: 加載中...})wx.downloadFile({url: value.url, // 文件的本身urlfilePath: wx.env.USER_DATA_PATH / r…

ES使用心得

客戶端 Transport Client已經快要廢棄了,官方推薦使用High Level REST Client。 常用命令 啟停 systemctl start elasticsearch systemctl stop elasticsearch節點狀態 curl http://myservice1:9200/_cat/nodes?vip heap.percent ram.percent cpu l…

解壓版 MySQL 數據庫的安裝與配置

目錄 1 下載2 安裝3 配置3.1 添加環境變量3.2 新建配置文件3.3 初始化MySQL3.4 注冊MySQL服務3.5 啟動MySQL服務3.6 修改默認賬戶密碼 4 登錄5 卸載 安裝環境:Win10 64位 軟件版本:MySQL 5.7.24 解壓版 1 下載 點擊鏈接 進入如下界面 ??注意: 我們一般不會選擇最新…

防火墻筆記

什么是防火墻 在計算機網絡中是指設置在可信任的內部網絡和不可信任的外部網絡之間的屏障,通過強化邊界控制保障內容安全,同時不妨礙內部對外部的訪問。 20世紀80年代,最早的防火墻幾乎與路由器同時出現,第一代防火墻主要基于包過…

RocketMQ 5.1.0 源碼詳解 | Producer 發送流程

文章目錄 初始化DefaultMQProducer實例發送流程DefaultMQProducer#sendDefaultMQProducerImpl#sendMQClientInstance#updateTopicRouteInfoFromNameServer使用特定 topic 獲取路由信息使用默認 topic 獲取路由信息 DefaultMQProducerImpl#sendDefaultImpl發送流程總結 初始化De…

記一次練習(內容待完善)

記錄最近一次爬蟲和數據可視化練習 0、數據獲取 import pandas as pdyear [2018,2019,2020,2021,2022] header {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile S…

31 | 獨角獸企業數據分析

獨角獸企業:是投資行業尤其是風險投資業的術語,一般指成立時間不超過10年、估值超過10億美元的未上市創業公司。 項目目的: 1.通過對獨角獸企業進行全面地分析(地域,投資方,年份,行業等),便于做商業上的戰略決策 項目數據源介紹 1.數據源:本項目采用的數據源是近…

2023年大廠前端面試題匯總

一、58同城前端面試題27道 1. css盒模型 2. css畫三角形 3. 盒子水平垂直居中(所有方式) 4. 重繪、重排 重繪就是重新繪制(repaint):是在一個元素的外觀被改變所觸發的瀏覽器行為,瀏覽器會根據元素的新屬性…

文檔控件DevExpress Office File API v23.1新版亮點 - 支持.NET MAUI

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫,不用安裝Microsoft Office,就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

Spring Security自定義登陸界面和密碼驗證邏輯

maven依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> 創建配置文件處理跳轉攔截等功能以及密碼比對功能 package com.example.demo2.demos.web1;…

Shell 變量

Shell 變量 定義變量時&#xff0c;變量名不加美元符號&#xff08;$&#xff0c;PHP語言中變量需要&#xff09;&#xff0c;如&#xff1a; your_name"runoob.com" 注意&#xff0c;變量名和等號之間不能有空格&#xff0c;這可能和你熟悉的所有編程語言都不一樣…

python如何實現1ms內觸發兩個接口請求

在Python中&#xff0c;可以通過多線程或者協程來實現1ms內觸發兩個接口請求。以下是兩種方法的示例代碼&#xff1a; 1.多線程實現&#xff1a; import threading import requestsdef send_request(url):response requests.get(url)print(response.text)# 創建兩個線程&…

nginx一般輪詢、加權輪詢、ip_hash等負載均衡模式配置介紹

一.負載均衡含義簡介 二.nginx負載均衡配置方式 準備三臺設備&#xff1a; 2.190均衡服務器&#xff0c;2.191web服務器1&#xff0c;2.160web服務器2&#xff0c;三臺設備均安裝nginx&#xff0c;兩臺web服務器均有網頁內容 1.一般輪詢負載均衡 &#xff08;1&#xff09…

ARTS 挑戰打卡的第9天 --- 如何知道一個數是否為2的若干次冪(Algorithm)

前言 &#xff08;1&#xff09;今天看到一個有意思的問題&#xff0c;如何判斷一個數字是否為2的若干次冪。這個問題并不難&#xff0c;但是對于我們的C語言功底還是有一點點的考驗的。 &#xff08;2&#xff09;希望各位可以先自行思考&#xff0c;實在想不出來再看后面的講…

【es6】具名組匹配

1、組匹配 正則表達式使用圓括號進行組匹配&#xff0c;如&#xff1a;const RE_DATE /(\d{4})-(\d{2})-(\d{2})/;,三個圓括號形成了三個組匹配。 代碼&#xff1a; const RE_DATE /(\d{4})-(\d{2})-(\d{2})/;const matchObj RE_DATE.exec(1999-12-31); const year matchO…

rabbitmq的消息應答

消費者完成一個任務可能需要一段時間&#xff0c;如果其中一個消費者處理一個長的任務并僅只完成 了部分突然它掛掉了&#xff0c;會發生什么情況。RabbitMQ 一旦向消費者傳遞了一條消息&#xff0c;便立即將該消 息標記為刪除。在這種情況下&#xff0c;突然有個消費者掛掉了…