[英]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.