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

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

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


person Silverbolt    schedule 29.03.2011    source источник


Ответы (6)


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

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

person Emmanuel    schedule 29.03.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% буду их использовать, конечно, если выбор за мной.

person Renato Gama    schedule 29.03.2011

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

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

person yegor256    schedule 29.03.2011

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

Адаптер объекта зависит от состава объекта: введите здесь описание изображения

Источник изображений: книга Design Pattern (Elements of Reusable Object-Oriented Software).

person K.Kirivarnan    schedule 12.10.2014

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

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

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

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

person Md. Abu Nafee Ibna Zahid    schedule 02.11.2017