Какой смысл в Facade в Java EE?
Я не очень понимаю точку фасада.
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
Если у меня есть этот код, и тогда у меня есть EJB, как это.
@Stateless
public class WrapSpecFacade extends AbstractFacade<WrapSpec> {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public WrapSpecFacade() {
super(WrapSpec.class);
}
}
В чем смысл этого? Зачем называть это фасадом? Для меня это просто абстрактный класс, который группирует аналогичную функциональность. Спасибо.
Ответы
Ответ 1
Фасад - это шаблон дизайна. Шаблон, шаблон программного обеспечения, представляет собой набор правил для организации кода и предоставления ему определенной структуры. Некоторые цели могут быть достигнуты с использованием шаблона.
При разработке приложения используется шаблон проектирования.
Шаблон Facade позволяет программистам создавать простой интерфейс для объектов для использования других объектов.
Подумайте о работе с очень сложной группой классов, реализующей свои собственные интерфейсы.
Ну, вы хотите предоставить интерфейс, чтобы выявить только некоторые функции многих, которые у вас есть.
Поступая таким образом, вы получаете простоту, гибкость, интеграцию и развязку кода.
Фасад в вашем примере используется для управления связью между многими участниками. Это проблема дизайна. Когда у вас много взаимодействующих компонентов, чем больше они связаны, тем сложнее будет их поддерживать (я имею в виду обслуживание кода). Фасад позволяет вам достичь свободной связи, которая является целью, к которой должен стремиться программист.
Рассмотрим следующее:
public class MyClass1 implements Interface1 {
public void call1() {}
public call call2() {}
}
public class MyClass2 implements Interface2 {
public void call3() {}
public void call4() {}
}
public class MyClass {
private MyClass1 a;
private MyClass2 b;
//calling methods call1 call2 call3 and call4 in other methods of this class
...
...
}
Если вам пришлось изменить бизнес-логику, расположенную в классе, используемом call1 или call2..., не изменяя интерфейс, вам не нужно будет изменять все эти классы, а просто класс внутри метода, используемого одним из интерфейсные методы первых двух классов.
Фасад позволяет вам улучшить этот механизм.
Мне жаль, но я понимаю, что это не выглядит так замечательно. Шаблоны проектирования сильно используются в индустрии программного обеспечения, и они могут быть очень полезны при работе над крупными проектами.
Вы можете указать, что ваш проект не настолько велик, и это может быть правдой, но Java EE направлена на то, чтобы помочь бизнес-приложениям и программам на уровне предприятия. Поэтому иногда по умолчанию используется шаблон фасада (некоторые IDE тоже используют его).
Ответ 2
Обычно этот шаблон используется либо для скрытия реализации базовых классов, для которых он представляет интерфейс, либо для упрощения базовой реализации того, что может быть сложным.
Фасад может представлять простой интерфейс для внешнего мира, но под капотом делают такие вещи, как создание экземпляров других классов, управление транзакциями, обработка файлов или TCP/IP-соединений - все, от чего вы можете быть защищены упрощенный интерфейс.
Ответ 3
В вашем конкретном контексте это не фасад. То, что у вас есть в этом коде, - это, в основном, DAO (объект доступа к данным).
DAO можно рассматривать как фасад для операций с БД, но это не основная цель. Он в основном намерен скрыть внутренние базы БД. В вашем примере, если вы переводите базовую систему хранения в файлы XML или в какое-то хранилище ключей, например HBase, вы все равно можете использовать методы, определенные в этом "Фасад", и никаких изменений не требуется в клиентском коде.
A (традиционный) Фасад имеет дело со сложными проектами, которые нужно скрывать от клиентов. Вместо того, чтобы подвергать сложный API и сложные потоки (получить это от этой службы, передать ее этому конвертеру, получить результат и подтвердить его с помощью этого, а затем отправить его на эту другую службу), вы просто инкапсулируете все это в Facade и просто выставить простой метод клиентам. Таким образом, наряду с тем, что ваш API намного проще в использовании, вы также можете изменить базовую (сложную) реализацию, не нарушая код своих клиентов.