В Vaadin хороший ОО-подход заключается в разделении логики пользовательского интерфейса на пользовательские компоненты, которые реализуют единый элемент пользовательского интерфейса приложения и максимизируют возможность повторного использования.
Наследуйте CustomComponent и создайте там пользовательский интерфейс, а также добавьте туда все обработчики событий. Публикуйте только логический API. То же относится и к событиям. Например: класс OrderEditor расширяет CustomComponent такими функциями, как setOrder (Order) и getOrder (). Где заказ - это ваш бизнес-класс. Создает пользовательский интерфейс для управления объектом Order. При необходимости вызывает saveOrder (Order) в вашем сервисном API или отправляет событие OrderChanged для обработки в другом месте.
Также утверждается, что CustomComponent не сильно отличается от классов Layout. Это означает, что не стоит иметь большого значения расширять их вместо CustomComponent. Однако главное здесь заключается в том, что вы составляете логические части пользовательского интерфейса с помощью логического бизнес-API - публикуете только минимальное количество API-интерфейсов Vaadin, которые позволяют управлять внутренней реализацией вашего компонента.