Подтвердить что ты не робот

Шаблон адаптера: адаптер класса и адаптер объектов

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Сначала скажем, что у нас есть пользователь;

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, который будет делать ECXATLY то же самое в другом классе!!!)... Использование интерфейса - все о неприкрытии, вот основная причина, по которой я на 99% могу их использовать, конечно, если выбор зависит от меня.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

  • адаптеры класса адаптируют Adaptee к Target, перейдя к определенному классу адаптера, не будут работать, если мы хотим адаптировать класс и его подклассы.
  • адаптеры объектов позволяют одному адаптеру работать со многими Adaptees (иерархия Adaptee и all adapttees)

Ответ 6

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

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

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