只读接口模式和外观模式有什么区别?

用户8363

假设我为一个类编写了一个门面,并公开了除设置方法外的所有方法。只读接口模式有什么功能区别?

根据关于不可变接口Wikipedia文章,我会说Facade具有不可变接口的优点(当我将类命名为Foo且我的外观为ImmutableFoo时),而没有能够将不可变接口转换为“不可变接口”的缺点具体,易变的类型,并使其状态发生变化”。

编辑

事实证明,Wikipedia上的不变接口文章没有讨论只读接口模式,在本演示文稿的幻灯片49和50中对此进行了描述答案是外观和只读接口确实可以通过使用包装器类来实现,但是它们有不同的用途(有关更多详细信息,请参见接受的答案和注释)。

林某宏

Facade模式的主要目的不是使您的界面不可变。

维基百科

外观是为大型代码(例如类库)提供简化接口的对象外墙可以:

  • 由于立面具有执行常见任务的便捷方法,因此使软件库更易于使用,理解和测试。
  • 出于相同的原因,使库更具可读性;
  • 由于大多数代码使用外观,因此减少了外部代码对库内部工作的依赖,从而在开发系统时具有更大的灵活性;
  • 用一个设计良好的API(根据任务需要)包装设计不佳的API集合。

外墙可能是可变的。它们用于提供简化的界面。

在将类称为“门面”之前,您应该问自己,它是否提供了简化的界面并使该库更易于使用?

它们可能有一些重叠,但是主要目的是不同的。

外观是关于API的简化

假设您正在开发电子商务系统的订单处理功能。你的核心库提供了三种方法:ChangeOrderStatus()SendOrderToFulfillment()SendOrderUpdateEmailToCustomer()

如果没有立面,则必须在需要批准订单的任何地方调用这三种方法。太无聊了,容易犯错误。如果您将一个ApproveOrder()方法添加Facade(仅调用这三个方法),则只需要ApproveOrder()在需要批准订单的地方调用即可。这简化了api,并使该库更易于使用。

如果您的应用程序显然分为多个层。Facade Layer的基础架构层可能非常薄您的所有UI代码都将与外观层(而不是基础结构层)进行交互。在我的例子,ApproveOrder()是在外观层,同时ChangeOrderStatus()SendOrderToFulfillment()SendOrderUpdateEmailToCustomer是在基础设施层。

只读接口与数据保护有关

一些对象应该是不可变的。例如,immutable对象通常在多线程中是首选的,因为它们不会公开更改状态的方法,因此可以安全地在线程之间共享。

模式与目标

您提到幻灯片(第50页)中,“只读接口”模式是实现“不变”的特定模式。但这不是实现“不变”的唯一方法。

如果遵循特定的“只读接口”模式,则可以说您实现了该模式。但是,如果您使用其他方法来实现“不可变”,我们不能说您实现了“只读接口”模式,但是您确实实现了“不可变”目标。

是否实现“只读接口”模式有关系吗?当然不是,您关心的是“不可变的”,而不是特定的“只读接口”模式。(有时,api有setter,但是如果您调用它们,它们将抛出异常。这是实现“不变”的另一种方法。您只需选择最合适的解决方案即可实现相同的目标。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章