Design patterns 只读接口模式和外观模式之间的区别是什么?
假设我为一个类编写一个facade,并公开它的所有方法,除了它的setter。与只读接口模式的功能区别是什么 基于这一点,我想说facade具有不可变接口的优点(当我将我的类命名为Foo并且我的facade是不可变的Foo时),而没有能够将不可变接口转换为“具体的、可变的类型,并使其状态发生变化”的缺点 编辑Design patterns 只读接口模式和外观模式之间的区别是什么?,design-patterns,interface,immutability,readonly,facade,Design Patterns,Interface,Immutability,Readonly,Facade,假设我为一个类编写一个facade,并公开它的所有方法,除了它的setter。与只读接口模式的功能区别是什么 基于这一点,我想说facade具有不可变接口的优点(当我将我的类命名为Foo并且我的facade是不可变的Foo时),而没有能够将不可变接口转换为“具体的、可变的类型,并使其状态发生变化”的缺点 编辑 事实证明,Wikipedia上的immutable interface文章并没有讨论只读接口模式,如上所述。答案是,facade和只读接口确实可以通过使用包装类来实现,但是它们有不同的用途
事实证明,Wikipedia上的immutable interface文章并没有讨论只读接口模式,如上所述。答案是,facade和只读接口确实可以通过使用包装类来实现,但是它们有不同的用途(有关更详细的观察,请参阅公认的答案和注释)。facade模式的主要目的不是使接口不可变 发件人: 门面是一个对象,它为更大的用户提供了简化的界面 代码体,例如类库。立面可以:
- 使软件库更易于使用、理解和测试,因为facade为常见任务提供了方便的方法李>
- 出于同样的原因,使图书馆更具可读性李>
- 减少外部代码对库内部工作的依赖性,因为大多数代码都使用外观,因此允许更多 系统开发的灵活性李>
- 用一个设计良好的API(根据任务需要)包装一个设计糟糕的API集合
ChangeOrderStatus()
,SendOrderToFulfillment()
,SendOrderUpdateEmailToCustomer()
如果没有门面,您必须在需要批准订单的任何地方调用这三种方法。这太无聊了,很容易出错。如果添加一个ApproveOrder()
方法作为Facade(它只调用这三个方法),则只需在需要批准订单的任何地方调用ApproveOrder()
。这简化了api,使库更易于使用
如果您的应用程序被明确划分为多个层。您可能在基础结构层的顶部有一个非常薄的外观层
。您的所有UI代码都将与facade层交互,而不是与infrastructure层交互。在我的示例中,ApproveOrder()
位于外观层,而ChangeOrderStatus()
,SendOrderToFulfillment()
,SendOrderUpdateEmailToCustomer
位于基础结构层
只读接口是关于数据保护的
有些对象被认为是不可变的。例如,immutable
对象通常是多线程中的首选对象,因为它们不公开方法来更改其状态,因此可以在线程之间安全地共享它们
模式与目标
从您提到的(第50页)来看,“只读接口”模式是实现“不可变”的特定模式。但这并不是实现“不变”的唯一途径
如果您遵循特定的“只读接口”模式,我们可以说您实现了该模式。但是如果您使用其他方法来实现“不可变”,我们不能说您实现了“只读接口”模式,但您确实实现了“不可变”的目标
实现“只读接口”模式与否有关系吗?当然不是,您关心的是“不可变”,而不是特定的“只读接口”模式。(有时,api有setter,但如果调用它们,它们会抛出异常。这是实现“不可变”的另一种方法。您只需选择最合适的解决方案即可实现相同的目标。)Facade模式的主要目的不是使您的接口不可变 发件人: 门面是一个对象,它为更大的用户提供了简化的界面 代码体,例如类库。立面可以:
- 使软件库更易于使用、理解和测试,因为facade为常见任务提供了方便的方法李>
- 出于同样的原因,使图书馆更具可读性李>
- 减少外部代码对库内部工作的依赖性,因为大多数代码都使用外观,因此允许更多 系统开发的灵活性李>
- 用一个设计良好的API(根据任务需要)包装一个设计糟糕的API集合
ChangeOrderStatus()
,SendOrderToFulfillment()
,SendOrderUpdateEmailToCustomer()
如果没有门面,您必须在需要批准订单的任何地方调用这三种方法。这太无聊了,很容易出错。如果添加一个ApproveOrder()
方法作为Facade(它只调用这三个方法),则只需在需要批准订单的任何地方调用ApproveOrder()
。这简化了api,使库更易于使用
如果你的申请我