Provider模式:軟件架構中的“供應商“設計哲學

文章目錄

  • Provider模式:軟件架構中的“供應商“設計哲學
    • 什么是Provider模式?
    • 經典應用場景
      • 1. 配置管理Provider
      • 2. 數據訪問Provider
      • 4. 消息隊列Provider
    • Provider模式的優勢
      • 1. 解耦合
    • 實際項目中的應用
    • Provider模式的最佳實踐
      • 1. 命名約定
      • 2. 接口設計原則
      • 3. 錯誤處理
    • 總結

Provider模式:軟件架構中的“供應商“設計哲學

在軟件開發中,你是否遇到過這樣的困擾:代碼與特定的數據源、配置來源或服務緊密耦合,導致測試困難、擴展性差?Provider 模式正是解決這類問題的經典設計模式。

什么是Provider模式?

Provider模式是一種創建型設計模式,它定義了一個統一的接口來"提供"某種資源或服務,而具體的提供方式由不同的實現類來決定

核心思想

  • 抽象供應:定義"提供什么",而不關心"如何提供"
  • 實現分離:將資源獲取的邏輯與業務邏輯分離
  • 可替換性:不同環境可以使用不同的Provider實現

為什么叫Provider?
Provider 這個詞來自英文"供應商"的概念:

現實世界:
餐廳(業務邏輯) <- 食材供應商(Provider) <- 不同來源(農場、批發市場、進口商)

軟件世界:
應用程序(業務邏輯) <- ConfigProvider <- 不同來源(文件、數據庫、配置中心)

經典應用場景

1. 配置管理Provider

// 配置提供者接口

type ConfigProvider interface {GetConfig(key string) (string, error)GetIntConfig(key string) (int, error)
}
// 文件配置提供者
type FileConfigProvider struct {filePath string
}func (p *FileConfigProvider) GetConfig(key string) (string, error) {// 從文件讀取配置return readFromFile(p.filePath, key)
}

// 環境變量配置提供者

type EnvConfigProvider struct{}func (p *EnvConfigProvider) GetConfig(key string) (string, error) {return os.Getenv(key), nil
}

// 遠程配置提供者

type RemoteConfigProvider struct {endpoint string
}func (p *RemoteConfigProvider) GetConfig(key string) (string, error) {// 從配置中心獲取return fetchFromRemote(p.endpoint, key)
}

應用場景:
開發環境使用本地文件
測試環境使用環境變量
生產環境使用配置中心

2. 數據訪問Provider

// 數據提供者接口
type DataProvider interface {GetUser(id string) (*User, error)SaveUser(user *User) error
}// MySQL數據提供者
type MySQLDataProvider struct {db *sql.DB
}// Redis數據提供者
type RedisDataProvider struct {client *redis.Client
}// 內存數據提供者(測試用)
type MemoryDataProvider struct {users map[string]*User
}
3. 認證Provider
// 認證提供者接口
type AuthProvider interface {Authenticate(token string) (*User, error)GenerateToken(user *User) (string, error)
}// JWT認證提供者
type JWTAuthProvider struct {secretKey string
}// OAuth認證提供者
type OAuthAuthProvider struct {clientID     stringclientSecret string
}// LDAP認證提供者
type LDAPAuthProvider struct {serverURL string
}

4. 消息隊列Provider

// 消息提供者接口
type MessageProvider interface {Publish(topic string, message []byte) errorSubscribe(topic string, handler func([]byte)) error
}// Kafka提供者
type KafkaMessageProvider struct {brokers []string
}// RabbitMQ提供者
type RabbitMQMessageProvider struct {connectionURL string
}// 內存隊列提供者(開發測試用)
type InMemoryMessageProvider struct {queues map[string][]chan []byte
}

Provider模式的優勢

1. 解耦合

// 不好的設計:直接依賴具體實現
type UserService struct {mysqlDB *sql.DB  // 強依賴MySQL
}// 好的設計:依賴抽象
type UserService struct {dataProvider DataProvider  // 可以是任何實現
}
  1. 可測試性
func TestUserService_GetUser(t *testing.T) {// 使用Mock Provider進行測試mockProvider := &MockDataProvider{users: map[string]*User{"123": {ID: "123", Name: "Test User"},},}service := NewUserService(mockProvider)user, err := service.GetUser("123")assert.NoError(t, err)assert.Equal(t, "Test User", user.Name)
}
  1. 環境適配
func NewUserService(env string) *UserService {var provider DataProviderswitch env {case "development":provider = NewMemoryDataProvider()case "testing":provider = NewMockDataProvider()case "production":provider = NewMySQLDataProvider(prodDB)}return &UserService{dataProvider: provider}
}

實際項目中的應用

云服務Provider

// 對象存儲Provider
type ObjectStorageProvider interface {Upload(key string, data []byte) errorDownload(key string) ([]byte, error)
}// AWS S3實現
type S3StorageProvider struct {client *s3.S3bucket string
}// 阿里云OSS實現
type OSSStorageProvider struct {client *oss.Clientbucket string
}// 騰訊云COS實現
type COSStorageProvider struct {client *cos.Clientbucket string
}

Provider模式的最佳實踐

1. 命名約定

接口名:XxxProvider
實現名:具體技術 + XxxProvider
// ? 好的命名
type ConfigProvider interface {}
type FileConfigProvider struct {}
type RedisConfigProvider struct {}// ? 不好的命名
type Config interface {}
type FileConfig struct {}

2. 接口設計原則

// ? 職責單一
type ConfigProvider interface {GetConfig(key string) (string, error)
}type CacheProvider interface {Get(key string) (interface{}, error)Set(key string, value interface{}) error
}// ? 職責混亂
type Provider interface {GetConfig(key string) (string, error)CacheGet(key string) (interface{}, error)SendEmail(to, subject, body string) error
}

3. 錯誤處理

type DatabaseProvider interface {GetUser(id string) (*User, error)
}// 定義特定的錯誤類型
var (ErrUserNotFound = errors.New("user not found")ErrConnectionFailed = errors.New("database connection failed")
)

總結

Provider模式是現代軟件架構中的重要設計模式,它通過抽象化資源提供方式,實現了:

  • 高內聚低耦合:業務邏輯與資源獲取分離
  • 可測試性:易于編寫單元測試
  • 可擴展性:新增Provider實現無需修改現有代碼
  • 環境適配:不同環境使用不同的Provider

在實際項目中,無論是配置管理、數據訪問、認證授權,還是第三方服務集成,Provider模式都能幫助我們構建更加靈活、可維護的系統架構。

記住:好的架構不是一開始就完美的,而是能夠優雅地適應變化的。 Provider模式正是這種適應性的體現。

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

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

相關文章

LTspic下載,幫助及演示電路

1.下載 LTspice是一款強大高效的免費SPICE仿真器軟件、原理圖采集和波形觀測器&#xff0c;為改善模擬電路的仿真提供增強功能和模型。其原理圖捕獲圖形界面使您能夠探測原理圖并生成仿真結果&#xff0c;這些結果可以通過內置波形查看器進一步觀察分析。 鏈接&#xff1a; …

位置編碼/絕對位置編碼/相對位置編碼/Rope原理+公式詳細推導及代碼實現

文章目錄1. 位置編碼概述1.1 為什么需要位置編碼&#xff1f;2. 絕對位置編碼 (Absolute Position Encoding)2.1 原理2.2 數學公式2.3 代碼實現2.4 代碼與公式的對應關系2.5 特性與優勢2.6 可學習的絕對位置編碼3. 相對位置編碼 (Relative Position Encoding)3.1 原理3.2 數學公…

網絡安全初級第一次作業

一&#xff0c;docker搭建和掛載vpm 1.安裝 Docker apt-get install docker.io docker-compose 2.創建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改寫文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…

交換類排序的C語言實現

交換類排序包括冒泡排序和快速排序兩種。冒泡排序基本介紹冒泡排序是通過重復比較相鄰元素并交換位置實現排序。其核心思想是每一輪遍歷將未排序序列中的最大&#xff08;或最小&#xff09;元素"浮動"到正確位置&#xff0c;類似氣泡上升。基本過程是從序列起始位置…

嵌入式 Linux開發環境構建之Source Insight 的安裝和使用

目錄 一、Source Insight 的安裝 二、Source Insight 使用 一、Source Insight 的安裝 這個軟件是代碼編輯和查看軟件&#xff0c;打開開發板光盤軟件&#xff0c;然后右鍵選擇以管理員身份運行這個安裝包。在彈出來的安裝向導里面點擊 next &#xff0c;如下圖所示。這里選擇…

【字節跳動】數據挖掘面試題0016:解釋AUC的定義,它解決了什么問題,優缺點是什么,并說出工業界如何計算AUC。

文章大綱 AUC(Area Under the Curve)詳解一、定義:AUC是什么?二、解決了什么問題?三、優缺點分析四、工業界大規模計算AUC的方法1. 標準計算(小數據)2. 工業級大規模計算方案3.工業界最佳實踐4.工業界方案選型建議總結:AUC的本質AUC(Area Under the Curve)詳解 一、…

Python后端項目之:我為什么使用pdm+uv

在試用了一段時間的uv和pdm之后&#xff0c;上個月(2025.06)開始&#xff0c;逐步把用了幾年的poetry替換成了pdmuv&#xff08;pipx install pdm uv && pdm config use_uv true) ## 為什么poetry -> pdm: 1. 通過ssh連接到服務器并使用poetry shell激活虛擬環境之…

鴻蒙Next開發,配置Navigation的Route

1. 通過router_map.json配置文件進行 創建頁面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上創建私有倉庫

一、在 GitHub 上創建私有倉庫打開 GitHub官網 并登錄。點擊右上角的 “” → 選擇 “New repository”。填寫以下內容&#xff1a; Repository name&#xff1a;倉庫名稱&#xff0c;例如 my-private-repo。Description&#xff1a;可選&#xff0c;倉庫描述。Visibility&…

量產技巧之RK3588 Android12默認移除導航欄狀態欄?

本文介紹使用源碼編譯默認去掉導航欄/狀態欄方法,以觸覺智能EVB3588開發板演示&#xff0c;Android12系統&#xff0c;搭載了瑞芯微RK3588芯片&#xff0c;該開發板是核心板加底板設計&#xff0c;音視頻接口、通信接口等各類接口一應俱全&#xff0c;可幫助企業提高產品開發效…

Conda 安裝與配置詳解及常見問題解決

《Conda 安裝與配置詳解及常見問題解決》 安裝 Conda 有兩種主流方式&#xff0c;分別是安裝 Miniconda&#xff08;輕量級&#xff09;和 Anaconda&#xff08;包含常用數據科學包&#xff09;。下面為你詳細介紹安裝步驟和注意要點。 一、安裝 Miniconda&#xff08;推薦&a…

Linux ——lastb定時備份清理

lastb 命令顯示的是系統中 /var/log/btmp 文件中的SSH 登錄失敗記錄。你可以像處理 wtmp 那樣&#xff0c;對 btmp 文件進行備份與清理。? 一、備份 lastb 數據cp /var/log/btmp /var/log/btmp.backup.$(date %F)會保存為如 /var/log/btmp.backup.2025-07-14? 二、清空 lastb…

自定義類型 - 聯合體與枚舉(百度筆試題算法優化)

目錄一、聯合體1.1 聯合體類型的聲明1.2 聯合體的特點1.3 相同成員的結構體和聯合體對比1.4 聯合體大小的計算1.5 聯合練習二、枚舉類型2.1 枚舉類型的聲明2.2 枚舉類型的優點總結一、聯合體 1.1 聯合體類型的聲明 像結構體一樣&#xff0c;聯合體也是由一個或者多個成員構成…

FS820R08A6P2LB——英飛凌高性能IGBT模塊,驅動高效能源未來!

產品概述FS820R08A6P2LB 是英飛凌&#xff08;Infineon&#xff09;推出的一款高性能、高可靠性IGBT功率模塊&#xff0c;采用先進的EconoDUAL? 3封裝&#xff0c;專為大功率工業應用設計。該模塊集成了IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;和二極管&#xff0c;適…

python學智能算法(十八)|SVM基礎概念-向量點積

引言 前序學習進程中&#xff0c;已經對向量的基礎定義有所了解&#xff0c;已經知曉了向量的值和方向向量的定義&#xff0c;學習鏈接如下&#xff1a; 向量的值和方向 在此基礎上&#xff0c;本文進一步學習向量點積。 向量點積 向量點積運算規則&#xff0c;我們在中學階…

【windows辦公小助手】比文檔編輯器更好用的Notepad++輕量編輯器

Notepad 中文版軟件下載&#xff1a;這個路徑總是顯示有百度無法下載&#xff0c;不推薦 更新&#xff1a;推薦下載路徑 https://github.com/notepad-plus-plus/notepad-plus-plus/releases 參考博主&#xff1a;Notepad的安裝與使用

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析 選擇題 題目一 運行如圖所示的程序,舞臺上一共會出現多少只小貓呢?( ) A. 5 B. 6 C. 7 D. 8 正確答案: B 答案解析: 程序中“當綠旗被點擊”后,角色先移到指定位置,然后“重…

對于獨熱編碼余弦相似度結果為0和詞向量解決了詞之間相似性問題的理解

文章目錄深入理解簡單案例結論詞向量&#xff08;Word Embedding&#xff09;簡介詞向量如何解決相似性問題&#xff1f;簡單案例&#xff1a;基于上下文的詞向量訓練總結對于獨熱表示的向量&#xff0c;如果采用余弦相似度計算向量間的相似度&#xff0c;可以明顯的發現任意兩…

數據結構·數狀數組(BIT)

樹狀數組(Binary Index Tree) 英文名&#xff1a;使用二進制下標的樹結構 理解&#xff1a;這個樹實際上用數組來存&#xff0c;二進制下標就是將正常的下標拆為二進制來看。 求x的最低位1的函數lowbit&#xff08;x&#xff09; 假設x的二進制表示為x ...10000&#xff0c;…

uniapp video視頻全屏播放后退出,頁面字體變大,樣式混亂問題

uniapp官方的說法是因為頁面使用rpx&#xff0c;但是全屏和退出全屏自動計算屏幕尺寸不支持rpx&#xff0c;建議使用px。但是因為uniapp端的開發都是使用rpx作為屏幕尺寸計算參數&#xff0c;不可能因為video全屏播放功能就整個全部修改&#xff0c;工作量大&#xff0c;耗時耗…