2011-01-25 11 views
13

Naprawdę nie rozumiem punktu fasady.Jaki jest sens elewacji w 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(); 
    } 
} 

Jeśli mam ten kod, a następnie mam taki EJB.

@Stateless 
public class WrapSpecFacade extends AbstractFacade<WrapSpec> { 
    @PersistenceContext 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public WrapSpecFacade() { 
     super(WrapSpec.class); 
    } 

} 

Jaki jest tego cel? Po co nazywać to elewacją? Dla mnie to tylko abstrakcyjna klasa, która grupuje podobną funkcjonalność. Dzięki.

Odpowiedz

16

Fasada to wzór projektu. Wzorzec, wzorzec oprogramowania, to zestaw reguł służących do porządkowania kodu i zapewniania mu określonej struktury. Niektóre cele można osiągnąć za pomocą wzorca. Podczas projektowania aplikacji używany jest wzorzec projektowy.

Wzór fasady umożliwia programistom utworzenie prostego interfejsu dla obiektów, w których będą używane inne obiekty. Rozważ pracę z bardzo złożoną grupą zajęć, wszystkie implementują własne interfejsy. Cóż, chcesz udostępnić interfejs, aby pokazać tylko niektóre funkcje wielu z nich. W ten sposób uzyskujesz prostotę kodu, elastyczność, integrację i luźne sprzężenie.

Fasada, w twoim przykładzie, jest używana w celu zarządzania sprzężeniem wielu podmiotów. To jest problem projektowy. Kiedy masz wiele komponentów współpracujących ze sobą, im więcej są one powiązane, tym trudniej będzie je utrzymać (mam na myśli konserwację kodu). Fasada pozwala osiągnąć luźne sprzężenie, co jest celem, do którego programista powinien zawsze dążyć.

Rozważmy następujący:

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 
    ... 
    ... 
} 

Jeśli trzeba było zmienić logikę biznesową znajdujący się w klasie wykorzystywanej przez call1 lub call2 ... przez nie zmieniając interfejs, nie będzie trzeba zmienić wszystkie te zajęcia, ale tylko klasa w metodzie użytej przez jedną z metod interfejsu dwóch pierwszych klas.

Fasada pozwala ulepszyć ten mechanizm.

Przykro mi, ale zdaję sobie sprawę, że to nie wygląda tak cudownie. Wzory projektowe są szeroko stosowane w branży oprogramowania i mogą być bardzo przydatne podczas pracy nad dużymi projektami. Można zauważyć, że projekt nie jest tak duży i może to być prawda, ale Java EE ma na celu pomoc w programowaniu aplikacji biznesowych i na poziomie przedsiębiorstwa. Dlatego czasami wzór elewacji jest używany domyślnie (niektóre IDE również go używają).

7

Zwykle ten wzór służy do ukrywania implementacji podstawowych klas, dla których przedstawia interfejs lub upraszcza podstawową implementację czegoś, co może być skomplikowane.

Fasada może stanowić prosty interfejs do świata zewnętrznego, ale pod maską można tworzyć instancje innych klas, zarządzać transakcjami, obsługiwać pliki lub połączenia TCP/IP - wszystko, czego można ochronić przed uproszczony interfejs.

6

W twoim konkretnym kontekście nie jest to tak naprawdę Fasada. To, co masz w tym kodzie, to w zasadzie DAO (Data Access Object).

DAO może być postrzegany jako fasada dla operacji DB, ale nie jest to jego główny cel. Chodzi głównie o ukrywanie wewnętrznych elementów DB.W twoim przykładzie, jeśli przełączasz system pamięci masowej na pliki XML lub do jakiegoś magazynu klucz-wartość, takiego jak HBase, nadal możesz korzystać z metod zdefiniowanych w tej "Fasadzie" i nie trzeba wprowadzać żadnych zmian w kodzie klienta.

A (tradycyjna) Fasada dotyczy złożonych projektów, które muszą być ukryte przed klientami. Zamiast eksponowania złożonego API i złożonych przepływów (pobierz to z tej usługi, przekaż je do tego konwertera, uzyskaj wynik i zatwierdź go, a następnie wyślij do tej innej usługi), po prostu obuduj wszystko w elewacji i po prostu wystawiać klientom prostą metodę. W ten sposób, wraz z faktem, że twoje API jest dużo łatwiejsze w użyciu, możesz również zmienić podstawową (złożoną) implementację bez naruszania kodu klienta.