2011-02-16 115 views
1

我想知道我們是否可以應用設計模式來編寫貨幣轉換代碼,如果是,那麼它們會是什麼?假設是轉換率是靜態的,我們可以對它們進行硬編碼。貨幣換算的設計模式?

我曾考慮過使用'狀態模式',其中每個狀態代表一個特定的貨幣,並將公式封裝到相應的轉換方法中。 'toDollars()','toPounds()'等。

另一種可能性(不確定它是否是設計模式)是使用函數對象從特定貨幣轉換爲另一種貨幣,其中第一級密鑰是'from'貨幣,第二級密鑰是'to'貨幣。

是否有任何其他設計模式適用於此問題?從最抽象的層面來看,問題在於我們有「實體」,它們都是基於一些特定的規則進行相互轉換的。例子是將時區值相互轉換;日曆日曆從不同的日曆類型(格里高利/中國)等等。

感謝和問候!

回答

4

從學習/設計的角度來看,這個問題是完全落後的,因爲目標不應該是應用設計模式,而是要解決問題並就解決方案和設計模式進行溝通。

但既然你問:設計模式噸可能是有意義根據要求:

  • 責任鏈:有您諮詢一個接一個轉換器的列表,直到一個可以轉換貨幣在手
  • 工廠方法:創建基於原始A轉換器和目標貨幣
  • 門面/裝飾:從另一種貨幣和一個轉換器創建一種貨幣的量,隱藏從客戶端API。
  • 辛格爾頓:如果你要確保你只有一轉換爲每次轉換
  • 值對象 ...

我推薦這個視頻:http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson 這是矯枉過正的問題,但它恰巧使用貨幣轉換作爲值對象的示例...

1

基本上,貨幣轉換是一個圖形問題,節點對應於不同貨幣和邊緣,對應於不同貨幣之間的轉換。通過使用例如廣度優先搜索來尋找最短的轉換路徑很容易,並且在找到兩種貨幣之間的連接之後,可以在它們之間創建新的直接邊界。爲了快速處理圖形,可以單獨存儲每個節點,並將節點的連接存儲在從貨幣名稱到邊的映射中。邊緣會存儲轉換率和指向目標/源貨幣節點的指針。或者,您可以使用圖形的矩陣表示。使用有向或無向圖很容易將其應用於對稱和非對稱轉換。但是,在查找連接之後,使用單獨的計算可以更好地實現不對稱比率,而不是將它們存儲在圖表中,除非您在所有貨幣之間都有一個完整的轉換表。

沒有必要比這更有趣,特別是如果你有靜態轉換率。使用toPounds()等函數對所有東西進行硬編碼似乎並不合理,除非您的貨幣非常少。類似convert(int amountInFixedPoint,string fromCurrency,string toCurrency)的API更加靈活。

1

轉換是簡單的算術,你爲什麼需要花哨的代碼結構? 你基本上已經有一個轉換率表與貨幣代碼相匹配(如果你想從任何轉換到任何轉換,而不是從一個轉換到另一個轉換)。 從表格或網格中選擇正確的比率,並執行簡單的除法或乘法(取決於轉換的方向)。

不需要設計模式,除非您想要獲得真正的幻想併爲每個特定的轉換(從一對)創建一個類,在這種情況下,您可以查看工廠以根據貨幣創建這些類的實例代碼你交給工廠。 把一個裝飾者或外觀放在工廠,所以你所要做的就是調用一個方法,然後調用工廠並使用結果。 誰知道,你可能想讓這個外觀成爲一個單體,所以你不必創建多個實例。

但是,所有這將是矯枉過正,對於這個問題,儘管他們可能也許是在執行轉換作爲其功能的一部分,希望通過一個公共接口(如插件架構),露出不同的計算系統爲宜。