Какой смысл Фасада в Java EE? - PullRequest
17 голосов
/ 25 января 2011

Я не совсем понимаю точку зрения фасада.

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);
    }

}

Что такоесмысл этого?Зачем называть это фасадом?Для меня это просто абстрактный класс, который группирует схожую функциональность.Спасибо.

Ответы [ 3 ]

17 голосов
/ 25 января 2011

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

Шаблон 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 также используют его).

8 голосов
/ 25 января 2011

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

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

7 голосов
/ 26 января 2011

В вашем конкретном контексте это не совсем Фасад.В этом коде в основном используется DAO (объект доступа к данным).

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

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

...