问题标签 [facade]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
132 浏览

design-patterns - 在外观类之外创建一个对象,它会破坏外观模式吗?

在 HomeCADEngine 外观类中,我有一个方法“addRoom(room:Room)”,它会将这个房间添加到 ArrayList。但是,当我们在外观类之外创建一个房间然后将其传递给 addRom() 方法时,它是否打破了外观模式?

0 投票
6 回答
5406 浏览

design-patterns - 最佳设计模式:适配器或外观

我无法决定哪种模式最适合以下问题。

我有一个客户端系统,它将与一个单独的子系统进行交互。子系统相当复杂,所以我需要两者之间的接口来简化客户端系统。这听起来非常适合 Facade 模式,但我认为 Adapter 模式也适合我的问题。

如果中间的接口通过简单的 API 调用调用子系统上的各个任务,有什么区别吗?

0 投票
2 回答
1490 浏览

nhibernate - 如何通过外观层设置 NHibernate Linq 获取策略

我使用 NHibernate 进行数据访问,但通过外观层访问它。该层由存储库的接口以及对应于 ISession 对象的 IUnitOfWork 接口组成。

为了正确管理检索到的实体,存储库在其构造函数中传递了一个 IUnitOfWork,并且 IUnitOfWork 用于加载。

IUnitOfWork 包含一个名为 All 的属性,它将类的所有实体作为 IQueryable 检索(用于以后过滤)。因此,检索今年创建的所有实体的存储库方法可能如下所示:

注意:这不是这些接口和类的完整代码!只有与我的问题相关的代码。

IUnitOfWork 接口:

UnitOfWork 具体类:

IFooRepository 接口

FooRepository 具体类

我想添加功能来指定获取策略,以便可以急切地加载相关实体。假设 Foo 有一个对应于另一个实体 Bar 的属性:

映射文件指定 Bar 是延迟加载的,但在我的 ThisYearsFoos 存储库属性中,我想指定 Bar 应立即加载以避免 N+1 选择。

在 Linq to NHibernate 中,我们可以使用 Expand() 扩展方法指定预取。但是这个扩展方法属于NHibernateQueryable类型,而IUnitOfWork接口的GetList方法只知道IQueryable。

显然,我不希望 IUnitOfWork 接口知道 INHibernateQueryable,因为它应该不知道 NHibernate。

使用我上面指定的设计,有没有我想不到的方法来做到这一点?还是我的设计需要重新思考?

谢谢

大卫

0 投票
2 回答
72564 浏览

design-patterns - 外观、代理、适配器和装饰器设计模式之间的区别?

FacadeProxyAdapterDecorator设计模式有什么区别?

从通用的角度来看,这样的模式似乎在做同样的事情,那就是:包装一个 API 并提供对它的访问

如何区分这些模式?
如何辨别一种模式何时比其他模式更适合?

0 投票
2 回答
367 浏览

java - 具有 3 种模式的 Java 客户端/服务器应用程序

我是一名大学生,我必须在月底之前完成以下任务......我必须用java编写一个实现3种模式的客户端/服务器应用程序:好莱坞原则外观模式模板方法模式......它必须至少有3-4 个域对象......数据库必须是 MS Access(我知道,我知道......)我应该查看的任何建议或资源,一些类似的工作,因为我不知道从哪里开始? 我正在考虑制作图书馆应用程序。我很感兴趣你会使用什么域对象以及你将如何开始......

0 投票
1 回答
1236 浏览

model-view-controller - ASP.NET MVC 应用程序中的 IRepository、IService、Unity,参考问题

我是 Unity 的新手,但这个问题对 IoC 来说更通用,而且我对整体实现 IoC 还是很陌生。我有这个项目结构的VS2010解决方案(稍微简化):

  • 业务对象 - 文件夹
    • DomainModel (Class Lib prj.) – Entity Framework 2 POCO 实体
  • 数据层 - 文件夹
    • DataAccess (Class Lib prj.) – EF2 EDMX
    • Repository (Class Lib prj.) – IRepository 接口和存储库具体实现
  • 表示层 - 文件夹
    • WebUI – MVC 项目
  • 服务层
    • Service (Class Lib prj.) – IService 接口和服务(外观模式)具体实现

所有项目都引用 DomainModel 项目。

存储库引用 DataAccess 项目。

服务层引用存储库项目。

WebUI 引用服务项目和 Unity 程序集。

我已将 Unity 配置为在 WebUI 中正确注入我的所有服务类型(通过自定义 UnityControllerFactory.cs 的 global.asax)。但是如何在服务层配置 Unity 以注入存储库对象?

我不想从 WebUI 中引用 Repository 项目,以确保在开发过程中没有任何快捷方式并绕过服务层。

我有几个想法(不确定它是否会解决它):

  1. 将 IRepository 接口移动到 DomainModel 并为 IRepository 添加 Unity.RegisterType<> 调用
  2. 在 Web.config 中设置 Unity 配置

任何方向都将不胜感激,特别是如何为服务层/存储库配置 Unity,以及关于项目的一般情况。

0 投票
3 回答
1224 浏览

design-patterns - 编程设计模式:门面与否?

我们团队中的另一个人为我提供了一个库作为他的 web 框架的 jar。我们称这个框架为“我朋友的框架”。

我需要他的框架中的一个特定类。该类公开的一半属性是我自己的应用程序真正需要的。另一半不需要。要检索此类的属性,您需要进行一些字符串操作。因为我将在这个类之上开发自己的框架,所以我想尽可能多地解耦依赖。也许将来我的另一个朋友会开发一个更好的框架。

所以我所做的是为该类生成了一个外观类。我自己的框架通过我的外观类访问属性。如果“我朋友的框架”确实改变了,我只需要改变一个外观类,其余的保持不变。此外,字符串操作是在外观类内部完成的。此外,外观类仅公开所需的属性。所以我自己的框架只是作为普通的 getter/setter 访问属性。

然而,我和这个人发生了争执。他强迫我直接使用他的课程,因为首先他永远不会改变他的课程的实现。所以他告诉我写一个门面类真的没有任何价值。但我不同意。

我错了吗?我相信我是对的。

0 投票
11 回答
33078 浏览

design-patterns - 外观和网关设计模式有什么区别?

或门面==网关?

0 投票
3 回答
826 浏览

java - 我的门面中的空指针:(

我已经写了一个任务管理器,而且它很长。顺便说一句,所有这些都是用 Java 编写的。所以我写了一个外观,你可以在下面看到 HashMap 存在问题,我怀疑我在构建过程中尝试添加到 HashMap 中的值不太顺利。触发空指针异常的方法是 create 方法。该方法的输入参数已经过我和我信任的调试器的验证。

这里的任何帮助都会很棒......我确定我忘了提及一些事情,所以我会尽快回复评论,因为我现在需要完成这件事。

0 投票
1 回答
170 浏览

jakarta-ee - 如何拆分 SFSB Facade?

我在开发基于 EJB 3 技术的应用程序时遇到了一些问题。

我想在会话 bean 中使用外观模式来将我的客户端(Web 应用程序)与我的实体 bean 分离。

我正在使用 SFSB 来管理用户会话。

所以我有一个FacadeLoginRemote远程接口,它向客户端公开方法doLogin()doLogout()等...目前这个 SFSB 还包括一些其他方法,例如getCourse(int id)getResource(int id)。并非所有用户都能真正获得课程获得资源,因此 Facade 在将值返回给客户端之前会执行一些检查。

我想拆分外观,将方法getCourse()放在getResource()一个特殊的类中,但留给FacadeLoginRemote检查用户权限的功能。

如果我制作一些不同的 SLSB,我会将它们公开给客户。因此,客户端将有可能直接连接到它们,避免来自FacadeLoginRemote.

我错了吗?有没有办法做到这一点?

提前致谢,

安德烈亚