2011-11-02 2 views
0

Я отрабатывает на моих шаблонов проектирования в данный момент и получил немного смущен, когда я наткнулся на этот учебник:Design Pattern Путаница

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

Если посмотреть на листинг 7 и далее, автор говорит, что это использует шаблон декоратора. Однако является ли одним из основных принципов этого шаблона обертывание объектов и обязанностей и поведения ADD?

Я думаю, что он больше похож на шаблон адаптера, так как он адаптирует специфический для MVC ModelStateDictionary для работы с более гибким документом IValidationDictionary, чтобы вместо него использовать различные реализации с помощью службы, если вместо этого использовались WPF и т. Д. Появляется новая ответственность или поведение.

Есть ли у меня это правильно или нет? Если я ошибаюсь, кто-нибудь может объяснить, почему?

Благодаря

+0

Декоратор будет выглядеть как оригинальный объект, тогда как адаптер возьмет объект и сделает его похожим на что-то другое. Существует много кода для чтения, но это в двух словах, как вы должны понимать разницу. – Chris

ответ

2

Я согласен с вами, что смотрит на меня, как Adapter Pattern, то есть, ModelStateDictionary абстрагируется за интерфейсом IValidationDictionary (интерфейс адаптера) с помощью конкретного типа (адаптера) таким образом, что реализация может быть изменена позже.

Decorator Pattern обычно обеспечивает дополнительную функциональность посредством композиции, отображая тот же интерфейс, что и декорированный тип. Обычно это делается путем подклассификации или реализации интерфейса.

Пример декоратора будет:

  1. у вас есть хранилище класса, который извлекает «объекты» из базы данных
  2. у вас есть хранилище класс декоратора, который может кэшировать объекты без необходимости извлечения их из базы данных каждый раз. Этот класс декоратора обеспечивает извлечение и извлечение кеша посредством композиции путем подклассификации исходного класса репозитория и переопределения метода Get() для первой проверки кеша для элемента (и Save() будет переопределен для обновления кэша, а также базы данных).
2

Я думаю, что вы правы, и что есть ошибка в сообщении. Из статьи:

Шаблон Decorator позволяет обернуть существующий класс в новый класс , чтобы реализовать интерфейс.

Это не совсем так - декораторы позволяют вам обернуть одну реализацию внутри другой, но намерение обычно заключается не в том, чтобы реализовать другой интерфейс, а в том, чтобы «украсить» экземпляр новой функциональностью. Шаблон адаптера позволяет вам использовать два несходных интерфейса и модифицировать один экземпляр, чтобы быть похожим на другой.

+0

Я согласен с вами в целом, но я бы сказал, что, хотя что-то, реализующее шаблон декоратора, может реализовать другой интерфейс, который не является частью шаблона. поэтому на самом деле намерение не должно быть украшено с целью реализации другого интерфейса. – Chris

+0

А, это хороший момент :) Декораторы будут выглядеть как оригинальная реализация, но будут иметь дополнительные методы или поведение. Например, декоратор 'ChocolateChipToppingDecorator' может вести себя как обычный' IceCreamSundae', но с добавленным поведением предоставления шоколадных чипов. Тем не менее, оба они все еще являются «IceCreamSundae». В примере, предоставленном OP, 'ModelStateDictionary' был завернут, чтобы вести себя как экземпляр' IValidationDictionary', так что это будет шаблон адаптера. – matt