Реализация одного и того же поведения с разными типами - PullRequest
1 голос
/ 06 мая 2011

ОК, прежде всего это делается на Java: Я десериализую текстовый файл. Каждая строка приводит к объекту из совершенно другой иерархии классов. Затем я передаю эти объекты другому объекту, назовем его «Writer», у которого есть метод с именем «write (x)», который затем сериализует часть этого объекта в другой формат. Поскольку каждый десериализованный объект относится к разной иерархии классов, я не могу обработать каждый объект одним и тем же модулем записи (содержимое также немного отличается каждый раз, так что все в порядке). Но меня беспокоит то, что в клиенте, который управляет всем этим процессом, мне приходится различать разные объекты.

Есть ли способ, чтобы "Писатель" мог решить для себя, что ему делать, без выполнения этой работы клиентом ...

Может быть, какой-то псевдокод поможет.

for(Line line : lines) {
  x = one of several kinds of objects is instantiated;
  w = one of several kinds of Writers is instantiated, analog to x;
  w.write(x);
}

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

Надеюсь, это не смущает.

1 Ответ

2 голосов
/ 06 мая 2011

Обычно в таких случаях вам следует создать интерфейс Writer:

public interface Writer {

  void write(Object o);

}

абстрактный класс AbstractWriter, который выполняет некоторую общую работу, а затем ряд классов, расширяющих этот AbstractWriter.

Затем создайте класс Factory, который создаст необходимую запись в соответствии с вашим типом объекта:

public class Factory {

  private Factory() {}

  public static Writer createWriter(Object o) {
    Writer result = null;
    if (o.getClass() == MyObject1.class) {
       result = new MyFirstObjectWriter();
    } else if (...) {
       ...
    } else {
       throw new IllegalArgumentException("Unsupported object class" + o.getClass());
    }
    return result;
  }
}

Тогда код клиента будет выглядеть так:

for (Line line : lines) {
  Object o = readObject(line);
  Factory.getWriter(o).write(o);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...