亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選擇不同數據庫的設計模式

選擇不同數據庫的設計模式

料青山看我應如是 2022-05-22 16:15:51
我創建了一個類來與我的數據庫交互:class MyDatabase {  connect() { /* ... */ }}并且數據庫有兩種模式:admin和client。我想為每種模式設置不同的類:class MyDatabaseAdmin {}class MyDatabaseClient {}它們都將實現相同的接口,但具有不同的下劃線實現。我想知道是否有一種設計模式來實例化父MyDatabase級選擇一個而不是另一個。就像是:const db = new MyDatabase({ mode: 'admin' })db.connect() // parent calls MyDatabaseAdmin.connect我不需要一個完美的答案,只需要一些我應該尋找的方向。
查看完整描述

2 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

如果它們沒有共同的代碼,那么它們實際上只是兩個獨立的類。您可能甚至不希望管理代碼出現在瀏覽器中,因為無論如何它都不能在那里使用。

您可以有一個工廠函數來查看管理參數并實例化適當的數據庫對象并返回它,但我認為我什至不明白您為什么要為此煩惱。

只需讓每個客戶端實例化適當的數據庫對象。如果有任何公共代碼,您可以讓兩個實現都從一個公共基類繼承,并將公共代碼放在基類中。

對!我忘了提,但是有一些通用代碼……例如,連接和身份驗證完全相同。您是否碰巧知道任何非常適合此用例的設計模式?我應該研究工廠嗎?

我認為具有繼承的通用基類可以解決這里的問題。它為您提供了一個放置公共代碼的自然位置,而不必在客戶端實現中包含服務器端代碼。瀏覽器實現和服務器實現都是一個子類,只存在于它們各自的平臺上。公共基類將在兩個地方都存在和使用。

您只需讓客戶端實例化適當的葉類,共享代碼位于基類中。如果要隱藏實際的類構造函數,可以使用工廠函數(它只是一個簡單的函數,它查看條件并為您創建適當的對象并返回它),但我不確定是否有任何令人信服的理由使用這里的工廠功能。您只會在它所針對的平臺上包含適當的葉類,因此沒有地方可以在同一代碼中使用其中一個或另一個。


查看完整回答
反對 回復 2022-05-22
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

你會考慮只有“用戶”嗎?那么每個用戶都可以有一個“角色”,可以是“用戶”或“管理員”。因此,基于該“角色”,您將為每個用戶定義權限。我發現這種解決方案更容易解決這類問題,但如果它不符合您的情況,請告訴我。



查看完整回答
反對 回復 2022-05-22
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號