我想知道我们是否可以将设计模式应用于编写货币转换代码,如果是,那么它们会是什么?假设转换率是静态的,我们可以对它们进行硬编码。
我考虑过使用“状态模式”,其中每个州都代表一种特定的货币,并将公式封装到相应的转换方法中,例如: 'toDollars()','toPounds()'等。
另一种可能性(不确定它是否为设计模式)是使用从特定货币转换为另一种货币的函数对象,并将它们存储为2级Hashtable中的值,其中第一级密钥是“来自”货币和二级密钥是'到'货币。
是否有其他设计模式适用于此问题?最抽象层面的问题是我们有'm'个实体,它们都是基于某些特定规则可互换的。例子是将时区值相互转换;日历可以从不同的日历类型(公历/中文)等相互进行。
谢谢和问候!
答案 0 :(得分:4)
从学习/设计的角度来看,这个问题是完全落后的,因为目标不应该是应用设计模式,而是解决问题并就解决方案和设计模式进行沟通有助于此。
但是你问过:根据要求,大量的设计模式可能有意义:
我推荐此视频:http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson 这个问题有点过分,但碰巧使用货币转换作为价值对象的一个例子......
答案 1 :(得分:2)
转换是简单的算术,你为什么需要花哨的代码结构? 您基本上是一个与货币代码匹配的转换率表(如果您想从任何一个转换为任何一个而不是从一个转换为任何一个,则转换为网格)。 从表格或网格中选择正确的速率,并执行简单的除法或乘法(取决于转换的方向)。
不需要任何设计模式,除非您希望获得真正的想象并为每个特定转换(从 - 到对)创建一个类,在这种情况下,您可能会查看工厂以根据货币代码创建这些类的实例你交出工厂。 在工厂放置一个装饰器或外观,所以你要做的只是调用一个方法,然后调用工厂并使用结果。 谁知道,您可能希望将该外观设为单例,这样您就不必创建多个实例。
但是这一切对于这个问题来说都是过度的,尽管它们可能适用于作为其功能的一部分执行转换并希望通过通用接口(如插件架构)公开不同计算的系统。
答案 2 :(得分:1)
基本上,货币转换是图形问题,其中节点对应于不同货币和边缘,对应于不同货币之间的转换。通过使用例如广度优先搜索,可以轻松找到最短的转换路径,并且在找到两种货币之间的连接后,可以在它们之间创建新的直接边缘。要快速处理图形,可以单独存储每个节点,并将节点的连接存储在从货币名称到边缘的映射中。边缘将存储转换率和指向目标/源货币节点的指针。或者,您可以使用图形的矩阵表示。使用有向或无向图可以很容易地将其应用于对称和非对称转换。但是,非对称速率可能更好地在找到连接后通过单独的计算实现,而不是将它们存储在图表中,除非您在所有货币之间有一个完整的转换表开始。
不需要比这更好,特别是如果你有静态转换率。使用像toPounds()这样的函数对所有内容进行硬编码似乎不合理,除非您的货币很少。像convert(int amountInFixedPoint,string fromCurrency,string toCurrency)这样的API更加灵活。