Java EE中的Facade有什么意义?

我真的不明白外立面的意义。

public abstract class AbstractFacade { private Class entityClass; public AbstractFacade(Class 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 findAll() { CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); return getEntityManager().createQuery(cq).getResultList(); } public List 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 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 { @PersistenceContext private EntityManager em; @Override protected EntityManager getEntityManager() { return em; } public WrapSpecFacade() { super(WrapSpec.class); } } 

这有什么意义? 为什么称它为立面? 对我而言,它只是一个将类似function组合在一起的抽象类。 谢谢。

门面是一种设计模式。 模式(软件模式)是一组规则,用于组织代码并为其提供特定结构。 使用模式可以达到一些目标。 在设计应用程序时使用设计模式。

Facade模式允许程序员为对象创建一个简单的界面来使用其他对象。 考虑使用一组非常复杂的类,所有类都实现自己的接口。 好吧,你想提供一个界面来公开你所拥有的许多function。 通过这样做,您可以实现代码简单性,灵活性,集成和松散耦合。

在您的示例中,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所使用的类中的业务逻辑,则不需要更改所有这些类,而只需更改其中一个接口方法所使用的方法中的类。前两个class。

Facade可以让您改进这种机制。

对不起,我意识到它看起来并不那么精彩。 设计模式在软件行业中大量使用,在处理大型项目时非常有用。 您可能会指出您的项目不是那么大,这可能是真的,但Java EE旨在帮助业务和企业级应用程序编程。 这就是为什么有时默认使用Facade模式(某些IDE也使用它)。

通常,此模式用于隐藏它为其提供接口的基础类的实现,或者用于简化可能复杂的基础实现。

外观可以为外部世界提供一个简单的界面,但是在底层可以创建其他类的实例,管理事务,处理文件或TCP / IP连接 – 所有这些都可以通过简化的界面来屏蔽。

在您的特定背景下,这不是一个真正的Facade。 你在该代码中拥有的基本上是DAO(数据访问对象)。

DAO可以看作是DB操作的Facade,但这不是它的主要目的。 它主要是为了隐藏DB内部。 在您的示例中,如果您将基础存储系统切换为XML文件或某些键值存储(如HBase),您仍然可以使用“Facade”中定义的方法,并且客户端代码中不需要进行任何更改。

(传统)Facade处理需要隐藏在客户端之外的复杂设计。 而不是暴露复杂的API和复杂的流(从这个服务获取,将其传递给此转换器,获取结果并使用它validation它然后将其发送到此其他服务),您只需将所有内容封装在Facade中向客户端公开一个简单的方法。 这样,除了您的API更易于使用之外,您还可以自由地更改底层(复杂)实现,而不会破坏客户端代码。