我试图找到教程和好的例子来解释这两者之间的区别,但无法找到任何信息。
纯制造和间接的行为是创建和分配责任给中间对象,所以谁能解释一下这些设计模式之间的区别?
谢谢!
如果您希望在组件之间创建较低的耦合,则使用Indirection。Larman在应用UML和模式中建议的例子是一个类TaxCalculatorAdapter。为了使客户机不必知道可能的适配器的内部工作原理,他用间接方式隐藏了它们,只公开了所需的API。这个间接性将与适应器高度耦合,但仅与客户端松散耦合。
Pure Fabrication中的PersistentStorage
确实是一个间接性 (Larman在书中这样说),因为它提供了较低的耦合。Pure Fabrication
超越了这一点,因为它创建的对象不是你的领域模型的一部分。
Sale
。由于Sale
拥有要保存的所有数据,因此它也可以用来保存Sale的逻辑(Information Expert)。但是,持久性逻辑与Sale概念无关,因此类将变得不内聚。此外,通过将Sale与特定的DB API耦合,您可以限制重用(间接到救援)。由于保存是一种通用的活动,您可能还会在同样需要保存的对象中复制代码。为了避免这种情况,您可以编造一些东西(纯粹的捏造),这意味着您创建了一些不是域模型的一部分的东西(这里:PersistentStorage
),但仍然捕获了应用程序中的基本活动。
因此,纯制造是一种专门化,或者说是间接的一种变体。
纯制造和间接都是GRASP的原则。本文中的以下示例可能会澄清您对pure fabrication
和indirection
的概念。
纯制造:
我们知道银行系统的领域模型包含Account
, Branch
, Cash
, Check
, Transaction
等类。域类需要存储有关客户的信息。为了做到这一点,一个选择是将数据存储职责委托给域类。这个选项将减少域类的内聚性(多于一个职责)。最终,这个选项违反了SRP
原则。
另一个选择是引入另一个不代表任何领域概念的类。在银行示例中,我们可以引入一个名为PersistenceProvider
的类。这个类不表示任何域实体。这个类的目的是处理数据存储函数。因此,PersistenceProvider
是一个纯粹的捏造。
:
这个原则回答了一个问题:如何使对象以一种使它们之间的键保持弱的方式相互作用?
解决方案是:将交互的责任赋予中间对象,以便不同组件之间的耦合保持较低。
例如,一个软件应用程序使用不同的配置和选项。要将域代码与配置解耦,需要添加一个特定的类——如下面的清单所示:
Public Configuration{
public int GetFrameLength(){
// implementation
}
public string GetNextFileName(){
}
// Remaining configuration methods
}
这样,如果任何域对象想要读取某个配置设置,它将请求configuration类对象。因此,主代码与配置代码是分离的。
如果你读过Pure Fabrication Principle,这个Configuration类就是一个纯制作的例子。但是间接的目的是创建解耦。另一方面,纯构造的目的是保持领域模型的整洁,并且只表示领域概念和职责。
许多软件设计模式,如Adapter
、Facade
和Observer
,都是间接原则的专门化。
纯构造类是一种没有概念的类,它被赋予了高内聚^,低耦合&;重用。间接它解决了分配避免事物之间直接耦合的责任的问题。它还确保了对象之间的低耦合。保持更高的驻留能力。