Дорогие друзья,
Подскажите пожалуйста стандартное ООП решение следующей задачи:
есть множество продуктов, разделенных на классы. И должны быть возможности:
- возможность добавлять продукт существующего класса;
- возможность редактировать существующий продукт;
- вывод продукта в клиентской части.
Как такая типичная задача решается с помощью ООП и паттернов?
Поясню где у меня затык: поскольку продукты разделены на классы, то само собой напрашивается ввести для каждого класса продукта свой class, который содержал бы уникальные для этого класса продукта свойства:
class Hammer
- size
- weight
- material
class Mug
- color
- photo
class Cat
- age
- tail length
Но как быть дальше? Например, чтобы администрировать продукт, логично было бы определить интерфейс для генерации админ. формы и применения ее результатов к объекту:
interface IEditable
- getAdminForm() : Form
- applyChangesFromForm(Form form)
и сказать, что каждый класс реализовает этот интерфейс.
class Hammer implements IEditable ...
В этом случае где-то в админской части будет код вида
drawAdminForm(IEditable item)
, через который все продукты будут администрироваться.
Но в этом случае получается что Hammer:
1. будет содержать какой-то низкоуровневый код для генерации формы;
2. будет привязка к конкретной реализации формы.
Другой вариант вынести код из Hammer:
class HammerConcreteAdminForm implements IHammer
/*ctor*/ HammerConcreteAdminForm(Hammer hammer) {...}
Но, поскольку HammerConcreteAdminForm очень тесно связана с Hammer, то хочется как-то его инкапсулировать в него. Иначе, например, добавили новое свойство в Hammer, забыли исправить HammerConcreteAdminForm и получили баг.
Как быть?
UPDATE: предполагается, что логика генераций форм для разных типов продуктов разные, то есть вариант «возвращать список полей и генерить форму внешним генератором форм» не подходит