假设我为一个类编写了一个门面,并公开了除设置方法外的所有方法。只读接口模式有什么功能区别?
根据关于不可变接口的Wikipedia文章,我会说Facade具有不可变接口的优点(当我将类命名为Foo且我的外观为ImmutableFoo时),而没有能够将不可变接口转换为“不可变接口”的缺点具体,易变的类型,并使其状态发生变化”。
编辑
事实证明,Wikipedia上的不变接口文章没有讨论只读接口模式,在本演示文稿的幻灯片49和50中对此进行了描述。答案是外观和只读接口确实可以通过使用包装器类来实现,但是它们有不同的用途(有关更多详细信息,请参见接受的答案和注释)。
Facade模式的主要目的不是使您的界面不可变。
从维基百科:
外观是为大型代码(例如类库)提供简化接口的对象。外墙可以:
- 由于立面具有执行常见任务的便捷方法,因此使软件库更易于使用,理解和测试。
- 出于相同的原因,使库更具可读性;
- 由于大多数代码使用外观,因此减少了外部代码对库内部工作的依赖,从而在开发系统时具有更大的灵活性;
- 用一个设计良好的API(根据任务需要)包装设计不佳的API集合。
外墙可能是可变的。它们用于提供简化的界面。
在将类称为“门面”之前,您应该问自己,它是否提供了简化的界面并使该库更易于使用?
它们可能有一些重叠,但是主要目的是不同的。
假设您正在开发电子商务系统的订单处理功能。你的核心库提供了三种方法:ChangeOrderStatus()
,SendOrderToFulfillment()
,SendOrderUpdateEmailToCustomer()
。
如果没有立面,则必须在需要批准订单的任何地方调用这三种方法。太无聊了,容易犯错误。如果您将一个ApproveOrder()
方法添加为Facade(仅调用这三个方法),则只需要ApproveOrder()
在需要批准订单的地方调用即可。这简化了api,并使该库更易于使用。
如果您的应用程序显然分为多个层。您Facade Layer
的基础架构层可能非常薄。您的所有UI代码都将与外观层(而不是基础结构层)进行交互。在我的例子,ApproveOrder()
是在外观层,同时ChangeOrderStatus()
,SendOrderToFulfillment()
,SendOrderUpdateEmailToCustomer
是在基础设施层。
一些对象应该是不可变的。例如,immutable
对象通常在多线程中是首选的,因为它们不会公开更改状态的方法,因此可以安全地在线程之间共享。
在您提到的幻灯片(第50页)中,“只读接口”模式是实现“不变”的特定模式。但这不是实现“不变”的唯一方法。
如果遵循特定的“只读接口”模式,则可以说您实现了该模式。但是,如果您使用其他方法来实现“不可变”,我们不能说您实现了“只读接口”模式,但是您确实实现了“不可变”目标。
是否实现“只读接口”模式有关系吗?当然不是,您关心的是“不可变的”,而不是特定的“只读接口”模式。(有时,api有setter,但是如果您调用它们,它们将抛出异常。这是实现“不变”的另一种方法。您只需选择最合适的解决方案即可实现相同的目标。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句