Это называется адаптер?+ адаптер против декоратора - PullRequest
4 голосов
/ 09 августа 2011

У меня есть 2 проекта: A и B, которые должны взаимодействовать друг с другом.

  1. Проект A вводит имена интерфейсов ISpecialTask ​​и Project B должны его реализовывать.

  2. В Projet B есть объект с именем TaskWithListOfProperties, который не может реализовать ISpecialTask, поскольку он имеет различную структуру свойств (кроме того, вся система знает, как работать с TaskWithListOfProperties, и я не хочу изменять ее структуру).

Поэтому я решил создать класс с именем SpecialTaskFromListOfProperties, который реализует ISpecialTask ​​и использует экземпляр TaskWithListOfProperties, чтобы использовать его для взаимодействия между проектами.

interface ISpecialTask {
    long Id{get;}
    long WorkerId{get;}
    long VehicleId{get;}
    long CustomerId{get;}
}

class TaskWithListOfProperties {
    IDictionary<string, long> Properties {get;
}

class SpecialTaskFromListOfProperties : ISpecialTask  {
    public SpecialTaskFromListOfProperties(TaskWithListOfProperties  ins) {
        ...
        ...
    }
    public long Id { get{ ... } }
    public long WorkerId { get{ ... } }
    public long VehicleId { get{ ... } }
    public long CustomerId { get{ ... } }
}

Является ли SpecialTaskFromListOfProperties шаблоном адаптера?
В чем разница между шаблоном адаптера и шаблоном декоратора?

Ответы [ 2 ]

11 голосов
/ 09 августа 2011

Из оригинальной книги GoF , цель шаблона Адаптера [Черная оса] [Wikipedia] предназначен для ...

преобразования интерфейса класса в другой интерфейс, ожидаемый клиентами.Адаптер позволяет классам работать вместе, что иначе невозможно из-за несовместимых интерфейсов.

В то время как назначение шаблона Decorator [Black Wasp] [Википедия] предназначено для ...

динамического добавления дополнительных обязанностей к объекту.Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.

Хотя шаблоны схожи, из определения ясно, что это шаблон адаптера.У вас есть квадратный колышек (TaskFromListOfProperties), который должен вписаться в круглое отверстие (ISpecialTask), поэтому вы адаптировали его, используя SpecialTaskFromListOfProperties.

Декоратор увеличит / расширитсуществующий функционал TaskFromListOfProperties, то есть он не изменит свой существующий интерфейс.Это не то, что SpecialTaskFromListOfProperties делает.

8 голосов
/ 09 августа 2011

Зависит от того, чего вы на самом деле пытаетесь достичь. Адаптер и Декоратор очень похожи, однако, когда вы реализуете Адаптер , вы не вносите никакой новой логики, кроме преобразования.При реализации Decorator вы фактически вводите некоторые совершенно новые функциональные возможности, которые никогда не существовали ранее в объекте, который вы декорируете.

Итак, если коротко, если свойства интерфейса Id, WorkerId и т. Д. Естественно происходят из TaskWithListOfProperties - тогда вы должны рассматривать его как Адаптер .В противном случае это Декоратор .

...