2011-02-16 117 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

转换是简单的算术,你为什么需要花哨的代码结构? 你基本上已经有一个转换率表与货币代码相匹配(如果你想从任何转换到任何转换,而不是从一个转换到另一个转换)。 从表格或网格中选择正确的比率,并执行简单的除法或乘法(取决于转换的方向)。

不需要设计模式,除非您想要获得真正的幻想并为每个特定的转换(从一对)创建一个类,在这种情况下,您可以查看工厂以根据货币创建这些类的实例代码你交给工厂。 把一个装饰者或外观放在工厂,所以你所要做的就是调用一个方法,然后调用工厂并使用结果。 谁知道,你可能想让这个外观成为一个单体,所以你不必创建多个实例。

但是,所有这将是矫枉过正,对于这个问题,尽管他们可能也许是在执行转换作为其功能的一部分,希望通过一个公共接口(如插件架构),露出不同的计算系统为宜。