Design patterns 编程设计模式:门面还是非门面?

Design patterns 编程设计模式:门面还是非门面?,design-patterns,facade,Design Patterns,Facade,我们团队中的另一个人为我提供了一个库作为他的web框架的jar。让我们把这个框架称为“我朋友的框架” 我需要从他的框架中得到一个特殊的类。该类公开的属性中有一半是我自己的应用程序真正需要的。另一半是不需要的。要检索此类的属性,需要执行一些字符串操作。因为我将在这个类的基础上开发自己的框架,所以我希望尽可能地解耦依赖关系。也许将来我的另一个朋友会开发一个更好的框架 所以我所做的是为那个类生成一个facade类。我自己的框架通过facade类访问属性。如果“我朋友的框架”真的改变了,我只需要改变一个

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

我需要从他的框架中得到一个特殊的类。该类公开的属性中有一半是我自己的应用程序真正需要的。另一半是不需要的。要检索此类的属性,需要执行一些字符串操作。因为我将在这个类的基础上开发自己的框架,所以我希望尽可能地解耦依赖关系。也许将来我的另一个朋友会开发一个更好的框架

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


然而,我和这个家伙发生了争执。他强迫我直接使用他的类,因为第一次他不会改变他的类的实现。所以他告诉我写facade类真的没有价值。但我不同意


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

原则上你没有错

你错了,因为你所做的不是表面现象。Facade更常用于具有一组服务的API的情况。您可以同时使用所有这些服务,但这可能会变得复杂。该模式支持单个API接口facade,该接口将服务调用协调为可用的逻辑操作

您所做的更像适配器模式。通过将另一个类放在它前面,您正在使他的类适应您的用例

请注意,我只是指出一个语义问题,实际上您所做的是一个良好的设计实践


还要注意的是,如果你真的不打算在将来更新,你可能不需要经历麻烦。也许雅格尼——你不需要它。

对我来说,这是个不错的设计

Facades通常提供一个到更大的类子系统的接口,但我不明白为什么不能同时使用facade访问一个复杂的类

听起来,另一个人可能很固执——所以我认为与他的框架脱钩是件好事


如果你的facade更容易使用,也许你可以让他把它添加到他的框架中,并提供给其他人。

我觉得你的方法不错

只需确保您创建的接口与整个框架的实际实现非常独立。其他一些人指出,这是一个适配器,只是因为您试图解耦单个类,但我怀疑该类与其他类是耦合的

试着回答这个问题:这个门面应该隐藏什么秘密?
尝试发布一些您想要公开的方法,以便我们讨论。

“他强迫我直接使用他的类”。怎么用?他在给你打密码吗?我想你是对的。听起来你是一个更聪明的开发人员(如果你愿意为自己做一些额外的工作的话)。hvgotcodes的答案涵盖了我所能说的一切。我们一直在适配器类中包装API这次唯一奇怪的部分是你的朋友正在编写它。是的,你基本上是在为接口编码,然后为他的组件编写适配器。听起来不错。然而,(可能是由于“属性”的模糊概念),您可能希望接口不仅仅是getter和setter。。。只是想一想……我想你是对的。从语义上讲,它实际上是一种适配器模式。我真的不相信另一队的另一个人。他没有使用著名的框架,而是坚持自己的框架。我认为我的犹豫是有道理的:)事实上他很固执,因为他想自动生成我正在开发的框架。他声称,自动生成我创建的适配器类(当它只是一个简单的包装器时)比他创建的适配器类要困难得多。这确实只是一个单独的类,但这个适配器类是整个框架的核心。它本质上是模型容器。我没有为模型传输单个或数组的属性,而是传输一个模型类来包含所有需要的属性。这就像不是在方法周围传输xml,而是传输POJO等价物。