2011-11-02 78 views
0

我此刻在我的设计模式刷牙,并得到了有点困惑,当我遇到这个教程来了:设计模式混乱

http://www.asp.net/mvc/tutorials/iteration-4-make-the-application-loosely-coupled-cs

如果你看一下清单7起,笔者说,正在使用装饰者模式。但是,这种模式的主要原则之一是包装对象和添加责任和行为?

我认为它看起来更像和适配器模式,因为它正在适应MVC特定的ModelStateDictionary以更灵活的IValidationDictionary工作,以便不同的实现可以与服务一起使用(如果使用WPF等)。有新的责任或行为增加。

我有这个正确与否吗?如果我错了,请解释为什么?

感谢

+0

装饰器将看起来像原始对象,而适配器将采取一个对象,并使它看起来像不同的东西。这里有很多代码可供阅读,但简而言之,您应该如何区分这些差异。 – Chris

回答

2

我同意你的看法,这看起来对我来说就像Adapter Pattern,也就是说,ModelStateDictionary使用具体类型(适配器),使得执行以后可以修改的界面IValidationDictionary(适配器接口)背后抽象。

Decorator Pattern通常通过合成提供附加功能,展现与装饰类型相同的界面。这通常通过子分类或通过接口实现完成。

一个装饰的一个例子是:

  1. 您有从数据库
  2. 你有一个仓库装饰类,能够缓存对象,而不需要从获取它们取“物”一库类数据库每次。这个装饰器类通过对原始存储库类进行子分类并覆盖Get()方法来首先检查该项目的缓存(并且将重写Save()以更新缓存以及数据库)来提供缓存获取和通过合成检索。
2

我认为你是正确的,并且有在后的错误。从文章:

修饰器模式使您可以包装一个新的 类中的现有类,以实现一个接口。

这并不完全正确 - 装饰器允许你在另一个实现中包装一个实现,但通常不是实现另一个接口,而是用新功能“装饰”实例。适配器模式允许您采用两个不同的接口,并将一个实例修改为与另一个实例相似。

+0

我一般同意你的意见,但我会说,虽然实现装饰模式的东西可以实现另一个接口,但这不是模式的一部分。所以实际上这个意图应该永远不会被装饰成实现另一个接口的意图。 – Chris

+0

啊,这是一个很好的观点:)装饰师看起来像原来的实现,但会有额外的方法或行为定义。例如,'ChocolateChipToppingDecorator'装饰的行为可能像一个普通的'IceCreamSundae',但提供巧克力片的添加行为。尽管它们仍然是'IceCreamSundae'类型。在由OP提供的例子中,'ModelStateDictionary'正在缠绕表现得像一个'IValidationDictionary'的一个实例,因此这将是适配器模式。 – matt