В чем смысл фасада в 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);
    }

}

Какой в ​​этом смысл? Почему это называется фасадом? Для меня это просто абстрактный класс, который объединяет схожие функции. Спасибо.


person Drew H    schedule 25.01.2011    source источник


Ответы (3)


Фасад – это дизайнерский паттерн. Паттерн, программный паттерн — это набор правил для организации кода и придания ему определенной структуры. Некоторые цели могут быть достигнуты с помощью шаблона. Шаблон проектирования используется при разработке приложения.

Шаблон Facade позволяет программистам создавать простой интерфейс для объектов, чтобы они могли использовать другие объекты. Рассмотрите возможность работы с очень сложной группой классов, каждый из которых реализует собственный интерфейс. Что ж, вы хотите предоставить интерфейс, предоставляющий только некоторые функции из многих, которые у вас есть. Поступая таким образом, вы достигаете простоты кода, гибкости, интеграции и слабой связи.

Фасад в вашем примере используется для управления связью между многими участниками. Это вопрос дизайна. Когда у вас есть много компонентов, взаимодействующих друг с другом, чем больше они связаны, тем сложнее будет их поддерживать (я имею в виду обслуживание кода). 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..., не меняя интерфейс, вам не нужно было бы менять все эти классы, а только класс внутри метода, используемого одним из методов интерфейса первые два класса.

Facade позволяет усовершенствовать этот механизм.

Мне очень жаль, но я понимаю, что это не выглядит так замечательно. Шаблоны проектирования широко используются в индустрии программного обеспечения и могут быть очень полезны при работе над большими проектами. Вы можете указать, что ваш проект не такой уж большой, и это может быть правдой, но Java EE призвана помочь в программировании приложений на уровне бизнеса и предприятия. Вот почему иногда шаблон фасада используется по умолчанию (некоторые IDE также используют его).

person Andry    schedule 25.01.2011

Обычно этот шаблон используется либо для того, чтобы скрыть реализацию базовых классов, для которых он представляет интерфейс, либо для упрощения базовой реализации чего-то сложного.

Фасад может представлять собой простой интерфейс для внешнего мира, но под капотом делать такие вещи, как создание экземпляров других классов, управление транзакциями, обработка файлов или TCP/IP-соединений — все то, от чего вы можете быть защищены упрощенным интерфейсом.

person Griff    schedule 25.01.2011

В вашем конкретном контексте это не совсем Фасад. То, что у вас есть в этом коде, - это в основном DAO (объект доступа к данным).

DAO можно рассматривать как фасад для операций с БД, но это не является его основной целью. В основном он предназначен для того, чтобы скрыть внутренности БД. В вашем примере, если вы переключаете базовую систему хранения на XML-файлы или на какое-то хранилище ключей и значений, такое как HBase, вы все равно можете использовать методы, определенные в этом «Фасаде», и никаких изменений в клиентском коде не требуется.

(Традиционный) Фасад имеет дело со сложным дизайном, который необходимо скрыть от клиентов. Вместо того, чтобы предоставлять сложный API и сложные потоки (получить это от этой службы, передать этому конвертеру, получить результат и проверить его с помощью этого, а затем отправить его в эту другую службу), вы просто инкапсулируете все это в фасаде и просто предоставить клиентам простой метод. Таким образом, наряду с тем, что ваш API намного проще в использовании, вы также можете свободно изменять базовую (сложную) реализацию, не нарушая код вашего клиента.

person Costi Ciudatu    schedule 25.01.2011