2013-10-25 3 views
0

Я разрабатываю приложение (с java), где пользователь должен иметь возможность заполнить форму и отправить данные. Когда интернет-соединение доступно, данные должны быть отправлены на сервер, а если нет, - в локальную базу данных (sqllite). Итак, мне нужен дизайн для абстрактной передачи данных.Какой шаблон дизайна я должен использовать?

В данный момент я рассматриваю метод Factory, но я все еще не уверен.

Комментарии и предложения приветствуются!

ответ

3

Действительно, завод будет вполне разумно, но в сочетании с рисунком стратегии (как это замечено в других ответах).

Так у вас есть интерфейс:

interface FormSubmitter { 
    public void submitForm(FormData data); 
} 

И две реализации (стратегии):

class ServerFormSubmitter implements FormSubmitter { 
    @Override 
    public void submitForm(FormData data) { 
     // submit to the server 
    } 
} 

class LocalFormSubmitter implements FormSubmitter { 
    @Override 
    public void submitForm(FormData data) { 
     // save to DB 
    } 
} 

Но вам нужно выбрать правильную стратегию, вот где фабрика входит в игру:

class FormSubmitterFactory { 
    public static FormSubmitter getSubmitter() { 
     if (connectionAvailable()) { 
      return new ServerFormSubmitter(); 
     } else { 
      return new LocalFormSubmitter(); 
     } 
    } 
} 

И затем, когда придет время, вам необходимо отправить форму:

FormSubmitterFactory.getSubmitter().submitForm(formData); 
+1

Или вы могли бы * объединить их, что означает, что ServerFormSubmitter может проверить, доступно ли соединение, и делегировать LocalFormSubmitter, если это не так. –

+0

Но не означает ли это, что ServerFormSubmitter несет ответственность за слишком много вещей (отправка на сервер _and_ проверка наличия соединения _and_ делегирование его работы, если нет)? – siledh

+1

Еще один отличный способ справиться с этим прозрачно (без фабрики) - создать диспетчерскую реализацию стратегии (можно назвать FormSubmitter), которая проверит, какую фактическую стратегию (Сервер, Локальная) использовать и делегировать ей. –

1

Strategy Pattern может помочь вам здесь (один интерфейс стратегии и две реализации).

В компьютерном программировании, шаблон стратегии (также известный как шаблон политики) является шаблоном разработки программного обеспечения, в результате чего поведение алгоритма, может быть выбрано во время выполнения. Формально говоря, стратегия определяет семейство алгоритмов, инкапсулирует каждую из них, а делает их взаимозаменяемыми.

1

Заводской метод предназначен для создания объектов. Вам необходимо выбрать стратегию для подачи формы. О, и есть такая картина! ;-)

EDIT: Даже само имя объясняет. У вас есть две стратегии: если нет связи, я буду # 1. Если есть соединение, я буду # 2.

1

Я лично пойду за декоратором вместо стратегии. IMHO, стратегия больше используется для конфигурирования/логического потока, а не для ситуационной обработки (в данном случае, для соединения). Однако это основано на мнениях.

Кроме того, если делать что-то вроде этого:

if(connectionAvailable()){ 
// insert 1 
} else { 
// insert 2 
} 

Может есть состояние гонки между connectionAvailable и вставкой. Это может быть немного. Это мое Рекомендованное дизайн:

interface IFormSubmitter { 
    public void submitForm(FormData data); 
} 

public class SqlLiteFormSubmitter : IFormSubmitter{ 
    public void submitForm(FormData data){ 
     //insert into sqlite 
    } 
} 

public class DatabaseFormSubmitter : IFormSubmitter{ 
    public class DatabaseFormSubmitter(IFormSubmitter reservedSubmitter){ 
     // property assignment 
    } 
    public void submitForm(FormData data){ 
     try{ 
      // insert into database 
     } 
     catch(SQLException ex){ 
      if(isConnectionError(ex)){ 
       reservedSubmitter.submitForm(data); 
      } 
      else{ 
       throw e; 
      } 
     } 
    } 
} 

Твердая часть, вам нужно определить, является ли ваше исключение брошено основано на соединении или нет, на основе из пойманной exception объекта.

+0

Хороший подход. И вы правы в отношении состояния гонки, мы не гарантируем, что соединение будет доступно при вызове метода отправки. – siledh

+0

еще одно преимущество в этом дизайне - это дизайн только для одного подключения к базе данных, что уменьшает накладные расходы на перекрестке – Fendy

+0

Я считаю, что OP шел после подключения к Интернету, но вы по-прежнему правы. – siledh

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