Ищите хороший шаблон для реализации адаптеров View для объектов в Java / JSP - PullRequest
2 голосов
/ 03 февраля 2011

это больше вопрос дизайна.Предположим, у вас есть много bean-компонентов A, B, C .... Затем у вас есть класс, который создает, скажем, таблицы из bean-компонентов.Вам нужно что-то, что сообщает этому классу, какие свойства этих bean-компонентов отображать, какие имена дают столбцам и другие свойства рендеринга.Я не хочу связывать это в классе для каждого класса bean-компонентов, поэтому я подумывал о том, чтобы дать bean-компонентам общий интерфейс, такой как TableAdapterProvider, который будет предлагать класс, который дает все инструкции для класса рендеринга.Проблема в том, что я не могу сделать метод интерфейса статическим в Java.И это кажется не очень чистым по ряду причин ... например, чтобы создать пустую таблицу, я должен выделить bean-компонент и затем вызвать метод интерфейса TableAdapterProvider для получения класса «рендеринга».

Я думал о создании фабрики наподобие TableAdapterFactory(Class beanClass), которая бы возвращала правильный TableAdapter для каждого класса бинов, не вызывая его.В любом случае я должен обновить эту фабрику для каждого создаваемого бина.

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

Знаете ли вы лучший образец?Что вы думаете о моих подходах?

На будущее, есть ли хорошая книга с такими рецептами для использования в веб-приложениях?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2011

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

Но пусть фабрика попытается найти средство визуализации - либо сканируя определенный пакет, либо читаяимя класса средства визуализации из файла конфигурации.

И если фабрика не может найти средство визуализации, оно может использовать средство визуализации по умолчанию, которое просто отражает класс компонента и создает ячейки для всех полей.

0 голосов
/ 03 февраля 2011

Мне кажется, что любой bean-компонент (A, B, C ..), который должен отображаться в виде таблицы HTML (каким-то образом TableRenderer), должен реализовывать интерфейс, который обеспечивает средство визуализации необходимой информацией. Вероятные методы интерфейса будут получать заголовки столбцов и данные таблицы. Может быть, также один для стиля таблицы, но это немного субъективно.

Имея это в виду, вы могли бы;

public interface Renderable
{
  public List<String> getHeaders();
  public List<List<String>> getData();
}

public class A implements Renderable
{
  private String name;
  private int age;

  public List<String> getHeaders()
  {
    List<String> headers = new ArrayList<String>();
    headers.add("Name");
    headers.add("Age");
    return list;
  }

  public List<List<String>> getData()
  {
    List<List<String>> data = new ArrayList<List<String>();
    List<String> row = new ArrayList<String>();
    row.add(name);
    row.add(String.valueOf(age));
    data.add(row);
    return data;
  }

  //getters and setters

}

Тогда довольно просто написать свой TableRenderer;

public class TableRenderer
{
  public String render(Renderable r)
  {
     //draw a HTML table
     //draw table headers from r.getHeaders()
     //draw table rows from r.getData()
  }
}

Обратите внимание, что вместо написания TableRenderer класса вы можете использовать синтаксис JSTL <c:forEach>, который является более стандартным подходом.

0 голосов
/ 03 февраля 2011

вы можете использовать абстрактный класс.

реализовать выбранные общие методы в абстрактном классе

реализовать метод, специфичный для класса, в каждом классе.

добавленный код.

для генерации таблицы вам нужно вызвать метод generateTable с параметром, сгенерированным методу processBean

public abstract class Parent {
    /**
     * This method generates table from common input
     * @param commonTableMaterial
     * @return
     */
    private String generateTable(String commonTableMaterial ){
        return commonTableMaterial+"table me";
    }

    /**
     * This method is class specific - generating needed input to table
     * @return
     */
    abstract protected String processBean() ;

}

public class ChildA extends Parent {

    private String firstName ;
    private String lastName ;
    private String hiddenName ;

    @Override
    protected String processBean() {

        return firstName +lastName ;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...