簡體   English   中英

Java EE中的Facade有什么意義?

[英]What is the point of a Facade in 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);
    }

}

這有什么意義? 為什么稱它為立面? 對我而言,它只是一個將類似功能組合在一起的抽象類。 謝謝。

Facade是一種設計模式。 模式(軟件模式)是一組規則,用於組織代碼並為其提供特定結構。 使用模式可以達到一些目標。 在設計應用程序時使用設計模式。

Facade模式允許程序員為對象創建一個簡單的界面來使用其他對象。 考慮使用一組非常復雜的類,所有類都實現自己的接口。 好吧,你想提供一個界面來公開你所擁有的許多功能。 通過這樣做,您可以實現代碼簡單性,靈活性,集成和松散耦合。

在您的示例中,Facade用於管理許多actor之間的耦合。 這是一個設計問題。 當你有許多組件在一起交互時,它們越多,它們就越難以維護它們(我的意思是代碼維護)。 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旨在幫助業務和企業級應用程序編程。 這就是為什么有時默認使用Facade模式(某些IDE也使用它)。

通常,此模式用於隱藏它為其提供接口的基礎類的實現,或者用於簡化可能復雜的基礎實現。

外觀可以為外部世界提供一個簡單的界面,但是在底層可以創建其他類的實例,管理事務,處理文件或TCP / IP連接 - 所有這些都可以通過簡化的界面來屏蔽。

在您的特定背景下,這不是一個真正的Facade。 你在該代碼中擁有的基本上是DAO(數據訪問對象)。

DAO可以被視為數據庫操作的Facade,但這不是它的主要目的。 它主要是為了隱藏DB內部。 在您的示例中,如果您將基礎存儲系統切換到XML文件或某些鍵值存儲(如HBase),您仍然可以使用“Facade”中定義的方法,並且客戶端代碼中不需要進行任何更改。

(傳統)Facade處理需要隱藏在客戶端之外的復雜設計。 而不是暴露復雜的API和復雜的流(從這個服務獲取,將其傳遞給此轉換器,獲取結果並使用它驗證它,然后將其發送到此其他服務),您只需將所有內容封裝在Facade中向客戶端公開一個簡單的方法。 這樣,除了您的API更易於使用之外,您還可以自由地更改底層(復雜)實現,而不會破壞客戶端代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM