Шаблон адаптера: адаптер класса против адаптера объекта - PullRequest
31 голосов
/ 29 марта 2011

У меня есть несколько вопросов о шаблоне адаптера. Я понимаю, что адаптер класса наследуется от adaptee, тогда как у адаптера объекта есть adaptee в качестве объекта, а не наследование от него.

Когда бы вы использовали адаптер класса поверх адаптера объекта и наоборот? Кроме того, каковы компромиссы использования адаптера класса и компромиссы объектного адаптера?

Ответы [ 6 ]

23 голосов
/ 29 марта 2011

Я вижу одно преимущество для объектного адаптера, в зависимости от вашего языка программирования: если последний не поддерживает множественное наследование (например, Java), и вы хотите адаптировать несколько адаптеров за один раз, вы будетебыть обязанным использовать объектный адаптер.

Еще один момент для объектного адаптера заключается в том, что вы можете заставить обернутого адаптера жить так, как ему хочется (в частности, создание экземпляра, если вы создаете экземпляр адаптера ПОСЛЕ вашего адаптера), не имеяуказать все параметры (часть для вашего адаптера и часть для вашего адаптера из-за наследования) при создании экземпляра вашего адаптера.Этот подход кажется мне более гибким.

13 голосов
/ 29 марта 2011

Предпочитают использовать композицию, а не наследование

Во-первых, скажем, у нас есть пользователь;

public interface IUser
{
    public String Name { get; }
    public String Surname { get; }
}

public class User : IUser
{
    public User(String name, String surname)
    {
        this.Name = name;
        this.Surname = surname;
    }

    public String Name { get; private set; }
    public String Surname { get; private set; }
}

Теперь представьте, что по любой причине вам необходим адаптер для класса пользователя.тогда у нас есть два подхода: по наследству или по составному:

//Inheritance
public class UserAdapter1 : User
{
    public String CompleteName { get { return base.Name + " " + base.Surname } }
}

//Composition
public class UserAdapter2
{
    private IUser user;

    public UserAdapter2(IUser user)
    {
        this.user = user;
    }

    public String CompleteName { get { return this.user.Name + " " + this.user.Surname; } }
}

С вами все в порядке, но только если система не растет ... Представьте, что вам необходимо реализовать класс SuperUser, вчтобы справиться с новым требованием;

public class SuperUser : IUser
{
    public SuperUser(String name, String surname)
    {
        this.Name = name;
        this.Surname = surname;
    }

    public String Name { get; private set; }
    public String Surname { get; private set; }

    public Int32 SupernessLevel { get { return this.Name.Length * 100; } }
}

Используя наследование, вы не сможете повторно использовать свой класс адаптера, портя свой код (как если бы вам пришлось реализовать другой адаптер, наследующий от SuperUser)это сделало бы ТОЧНО то же самое, что и в другом классе !!!) ... Использование интерфейса - это все, что нужно для разблокировки, это главная причина того, что я на 99% могу использовать их, конечно, если выбор за мной.

11 голосов
/ 29 марта 2011

Class Adapter - это старое старое Наследование , доступное на любом объектно-ориентированном языке, а Object Adapter - это классическая форма шаблона проектирования адаптера .

Самым большим преимуществом Object Adapter по сравнению с Class Adapter (и, следовательно, Inheritance) является слабая связь клиента и адаптера.

4 голосов
/ 12 октября 2014

Адаптер класса использует множественное наследование для адаптации одного интерфейса к другому: (в зависимости от вашего языка программирования: Java & C # не поддерживает множественное наследование) enter image description here

Адаптер объекта зависит от состава объекта: enter image description here

Изображения Источник: шаблон проектирования (элементы многоразового объектно-ориентированного программного обеспечения) книга

1 голос
/ 02 ноября 2017

В дополнение к , о котором Ренатоарх упомянул в своем ответе , я бы хотел добавить преимущество класса адаптер .

В адаптере класса вы можете легко переопределить поведение адаптера , если вам нужно, потому что вы просто подкласс .И это труднее в объектном адаптере.

Однако преимущества объектного адаптера обычно перевешивают это крошечное преимущество классового адаптера.

0 голосов
/ 04 января 2014
  • адаптеры класса адаптирует Adaptee to Target путем фиксации к определенному классу Adapter, не будет работать, когда мы хотим адаптировать класс и его подклассы.
  • объектные адаптеры позволяет одному Адаптеру работать со многими Адаптированными (иерархия Адаптируемого и всех Адаптированных)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...