Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 只读接口模式和外观模式之间的区别是什么?_Design Patterns_Interface_Immutability_Readonly_Facade - Fatal编程技术网

Design patterns 只读接口模式和外观模式之间的区别是什么?

Design patterns 只读接口模式和外观模式之间的区别是什么?,design-patterns,interface,immutability,readonly,facade,Design Patterns,Interface,Immutability,Readonly,Facade,假设我为一个类编写一个facade,并公开它的所有方法,除了它的setter。与只读接口模式的功能区别是什么 基于这一点,我想说facade具有不可变接口的优点(当我将我的类命名为Foo并且我的facade是不可变的Foo时),而没有能够将不可变接口转换为“具体的、可变的类型,并使其状态发生变化”的缺点 编辑 事实证明,Wikipedia上的immutable interface文章并没有讨论只读接口模式,如上所述。答案是,facade和只读接口确实可以通过使用包装类来实现,但是它们有不同的用途

假设我为一个类编写一个facade,并公开它的所有方法,除了它的setter。与只读接口模式的功能区别是什么

基于这一点,我想说facade具有不可变接口的优点(当我将我的类命名为Foo并且我的facade是不可变的Foo时),而没有能够将不可变接口转换为“具体的、可变的类型,并使其状态发生变化”的缺点

编辑


事实证明,Wikipedia上的immutable interface文章并没有讨论只读接口模式,如上所述。答案是,facade和只读接口确实可以通过使用包装类来实现,但是它们有不同的用途(有关更详细的观察,请参阅公认的答案和注释)。

facade模式的主要目的不是使接口不可变

发件人:

门面是一个对象,它为更大的用户提供了简化的界面 代码体,例如类库。立面可以:

  • 使软件库更易于使用、理解和测试,因为facade为常见任务提供了方便的方法
  • 出于同样的原因,使图书馆更具可读性
  • 减少外部代码对库内部工作的依赖性,因为大多数代码都使用外观,因此允许更多 系统开发的灵活性
  • 用一个设计良好的API(根据任务需要)包装一个设计糟糕的API集合
正面可以是可变的。它们用于提供简化的界面。

在调用类a“Facade”之前,您应该问问自己,它是否提供了简化的接口并使库更易于使用

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

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

如果没有门面,您必须在需要批准订单的任何地方调用这三种方法。这太无聊了,很容易出错。如果添加一个
ApproveOrder()
方法作为Facade(它只调用这三个方法),则只需在需要批准订单的任何地方调用
ApproveOrder()
。这简化了api,使库更易于使用

如果您的应用程序被明确划分为多个层。您可能在基础结构层的顶部有一个非常薄的
外观层
。您的所有UI代码都将与facade层交互,而不是与infrastructure层交互。在我的示例中,
ApproveOrder()
位于外观层,而
ChangeOrderStatus()
SendOrderToFulfillment()
SendOrderUpdateEmailToCustomer
位于基础结构层

只读接口是关于数据保护的 有些对象被认为是不可变的。例如,
immutable
对象通常是多线程中的首选对象,因为它们不公开方法来更改其状态,因此可以在线程之间安全地共享它们

模式与目标 从您提到的(第50页)来看,“只读接口”模式是实现“不可变”的特定模式。但这并不是实现“不变”的唯一途径

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


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

Facade模式的主要目的不是使您的接口不可变

发件人:

门面是一个对象,它为更大的用户提供了简化的界面 代码体,例如类库。立面可以:

  • 使软件库更易于使用、理解和测试,因为facade为常见任务提供了方便的方法
  • 出于同样的原因,使图书馆更具可读性
  • 减少外部代码对库内部工作的依赖性,因为大多数代码都使用外观,因此允许更多 系统开发的灵活性
  • 用一个设计良好的API(根据任务需要)包装一个设计糟糕的API集合
正面可以是可变的。它们用于提供简化的界面。

在调用类a“Facade”之前,您应该问问自己,它是否提供了简化的接口并使库更易于使用

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

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

如果没有门面,您必须在需要批准订单的任何地方调用这三种方法。这太无聊了,很容易出错。如果添加一个
ApproveOrder()
方法作为Facade(它只调用这三个方法),则只需在需要批准订单的任何地方调用
ApproveOrder()
。这简化了api,使库更易于使用

如果你的申请我