2013-09-25 3 views
0

Я использую веб-сервис для получения курсов валют для 4 разных валют. То, что я делаю до сих пор, заключается в том, чтобы получить эти ставки и сохранить их в матрице 4x4 таким образом, чтобы любое значение можно было легко извлечь без использования веб-службы каждый раз.Применение шаблонов проектирования для установки и получения значений матрицы валюты

Что я хочу знать, это лучший подход, используя шаблоны проектирования (и который будет более уместным), чтобы установить и получить значения этой матрицы. Сейчас я просто использовать что-то вроде этого:

public void setPoundToEuro(float value) { 
    currencyMatrix[0][1] = value; 
} 

public float getPoundToEuro() { 
    return currencyMatrix[0][1]; 
} 

То, что я надеялся, что это что-то более абстрактное в зависимости от того, класс должен использовать эту услугу и получить эти значения. Что-то вроде другого класса, вызывающего метод, просто отправляющий две строки и тот же метод, возвращает любые курсы валют, в зависимости от полученных строк. В этом случае это будут «фунт» и «евро».

Я надеюсь, что дал понять, но если нет, сообщите мне. У меня таких вопросов не было, поэтому я надеюсь, что это не проблема, я пытаюсь обсудить и найти лучший подход к моей проблеме. Я уже видел это design patterns for currency conversion?, и это помогло мне прояснить что-то, но ситуация немного другая, поэтому я подумал, что разумно задать новый вопрос.

+1

Используйте карту, в которой ключ является классом с параметрами FromCurrency и ToCurrency, а значение - BigDecimal с коэффициентом конверсии. Убедитесь, что вы переопределите 'equals()' и 'hashCode()' в классе, который вы собираетесь использовать в качестве ключа. – Marcelo

+0

Спасибо за комментарий, Марсело. Это кажется выполнимым, но я надеялся, что подход к дизайну будет иметь вид. Во всяком случае, не могли бы вы привести более конкретный пример своей идеи? –

+1

Я уверен, что это школьный проект, но это, скорее всего, в ваших интересах [не использовать поплавки или парные разряды для валюты] (http://stackoverflow.com/q/3730019/42962). – hooknc

ответ

0

Я намного apprectiate всех предложений данных. Благодаря им я придумал очень простое решение, используя HashMap.

Я создал класс, в основном следующие:

private Map currencyMap; 

public CurrencyData() { 
    currencyMap = new HashMap(); 
} 

public void setCurrencyValue(String key, String value) { 
    currencyMap.put(key, value); 
} 

public String getCurrencyValue(String key) { 
    return currencyMap.get(key).toString(); 
} 

И на моем главном классе, так как программа инициализирует, я просто использовать веб-сервис для заполнения хеш-карты с помощью вызова метода setCurrencyValue ,

Если кто-либо видит какие-либо недостатки в этом текущем подходе, пожалуйста, дайте мне знать, я по-прежнему открыт для предложений.

+1

Ну, я полностью пропустил вашу точку ... Вы действительно запрашиваете WS и хотите кэшировать результат в своем приложении. Если бы вы могли объяснить нормальный поток, возможно, мы сможем дать вам дополнительные советы, но пока это выглядит нормально – Morfic

+1

Это выглядит разумно. – assylias

1

Не совсем наука о ракете, все еще нуждается в дополнительных проверках при конвертации, если ставки еще не определены и у них есть возможности для улучшений, но я считаю, что это немного ориентировано на объекты, и вы получаете картину.

Если бы вы были последовать совет Марсел с выделенными преобразователями, то currencyCache может быть Map<String, Converter> и метод преобразования что-то вроде currencyCache.get(from+to).calculate(amount)

public class CurrencyConverter { 
    static Map<String, Map<String, Double>> currencyCache = new HashMap<>(); 

    static { 
     for (ConversionDefinition definition : ConversionDefinition.values()) { 
      Map<String, Double> rates = currencyCache.get(definition.from); 

      if (rates == null) { 
       rates = new HashMap<>(); 
       currencyCache.put(definition.from, rates); 
      } 

      rates.put(definition.to, definition.rate); 
     } 
    } 

    public static Double convert(String from, String to, Double amount) { 
     return currencyCache.get(from).get(to) * amount; 
    } 

    public enum ConversionDefinition { 
     EURO_TO_USD("euro", "usd", 10d), 
     USD_TO_EUR("usd", "euro", 1/10d); 

     private final String from; 
     private final String to; 
     private final Double rate; 

     ConversionDefinition(String from, String to, Double rate) { 
      this.from = from; 
      this.to = to; 
      this.rate = rate; 
     } 
    } 
} 
+0

Также, пожалуйста, извините за использование двойного. Я просто пытался выразить идею – Morfic

+0

Я бы не использовал перечисление для этого: есть сотни валют, дающих тысячи возможных комбинаций, и скорость не постоянна ... – assylias

+0

Я согласен с вами в этом, и если это должно быть так, тогда ей может понадобиться другой, более гибкий механизм определения правил преобразования.Но учитывая, что у нее всего несколько валют, 4 атм, я думал, что это довольно прямолинейно. – Morfic

Смежные вопросы