Разница между шаблоном адаптера объекта и шаблоном адаптера класса - PullRequest
17 голосов
/ 02 апреля 2012

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

Постановка проблемы: Создать веб-сайт для социальных сетей и обеспечить функции импорта из Facebook, Google Plus и orkut. Я не могу решить, использовать ли адаптер объекта или адаптер класса.

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

Ответы [ 5 ]

36 голосов
/ 02 апреля 2012

Основное отличие:

  • Адаптер класса использует наследование и может только обернуть класс .Он не может обернуть интерфейс, поскольку по определению он должен быть производным от некоторого базового класса.

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

Разница незначительная.Обычно более поздний подход (предпочтение композиции перед наследованием ) предпочтительнее, как объяснено в ссылке, которую я приведу здесь:

Объектно-ориентированное программирование (ООП) слишком хорошоИзвестные кандидаты на повторное использование функциональности: Наследование (повторное использование whitebox) и Композиция (повторное использование blackbox).Если вы попытаетесь повторно использовать код путем наследования от класса, вы сделаете подкласс зависимым от родительского класса.Это делает систему во многих случаях излишне сложной, менее тестируемой и делает обмен функциональностью во время выполнения излишне сложным.Как [Разработчик чистого кода] вы должны следовать Принципу замены Лискова (LSP) , когда вам нужно решить, подходит ли наследование.

Композиция означает, что один класс использует другой.В дальнейшем вы будете продвигать разделение, четко определяя интерфейсы.Это также даст вам преимущество в том, что реализации могут быть легко заменены.Поэтому, прежде чем приступить к применению принципа подстановки Лискова, подумайте о концепции Favor Composition over Inheritance и спросите себя, почему вы не должны отдавать предпочтение композиции сразу.

"Поскольку наследование предоставляет подкласс деталям реализации его родителя,часто говорят, что «наследование нарушает инкапсуляцию».(Банда четырех 1995: 19)

8 голосов
/ 26 сентября 2015

Проще говоря, Class Adapter использует подклассы, а Object Adapter использует делегирование с использованием композиции.

Пример:

class MyExistingServiceClass {
    public void show() {
        System.out.println("Inside Service method show()");        
    }
}

interface ClientInterface {
    void display();
}

class MyNewClassAdapter extends MyExistingServiceClass implements ClientInterface {
    void display() {
        show();
    }
}

Выше приведен пример Class Class Adapter. Мы адаптировали MyExistingServiceClass к ClientInterface, вызвав существующий метод show () изнутри реализации display ().

Чтобы преобразовать это в объектный адаптер, код будет выглядеть так:

class MyNewObjectAdapter implements ClientInterface {

    MyExistingServiceClass existingClassObject;

    void display() {
        existingClassObject.show();
    }
} 

Теперь, когда использовать Object адаптер вместо Class Adatper,

  1. Когда нет способа подкласса класса, который будет адаптирован в соответствии с интерфейсом клиента. Например, когда MyExistingServiceClass объявлен как окончательный.

  2. Когда клиент ожидает контракт, который является не интерфейсом, а реализацией абстрактного класса. В этом случае у нас нет другого способа, кроме как создать подкласс ожидаемого класса клиента, и, поскольку мы не можем создать подкласс более чем одного класса, нет другого способа, кроме как использовать этот класс для адаптации в качестве композиции.

    abstract class AbstractClientClass {
        abstract void display();
    }
    
    class MyNewObjectAdapter extends AbstractClientClass { 
    
        MyExistingServiceClass existingClassObject;
    
        void display() {
            existingClassObject.show();
        }
    }
    
  3. Когда вам нужно адаптировать более одного объекта. Это тот случай, когда вы не работаете напрямую с объектом, который нужно адаптировать. Хорошим примером здесь будет класс JTable в javax.swing. Этот класс создает компонент таблицы GUI (графический интерфейс пользователя), заполненный информацией, которую ваш адаптер передает ему. Для отображения данных из вашего домена JTable предоставляет конструкторы, которые принимают экземпляр TableModel определено в javax.swing.table. JDK предоставляет существующую абстрактную реализацию TableModel с AbstractTableModel.

    class MyTableModel extends AbstractTableModel {
    
    MyDomainObject[] existingDomainObjects[];
    
    public int getColumnCount() {
        return 4;
    }
    
    public int getRowCount() {
        return existingDomainObjects.length();
    }
    
    public MyDomainObject getValueAt(int i) {
        return existingDomainObjects[i];
    }
    }
    

Здесь мы адаптировали MyDomainObject для использования с AbstractTableModel.

6 голосов
/ 02 апреля 2012

Адаптер объекта:

$Adapter = new MyEngine(new MyAdapter($options));
$Adapter->write('something');

Адаптер класса

MyAdapter extends BaseAdapter implements AdapterInterface { ... }
$Adapter = new MyAdapter($options);
$Adapter->write('something');
1 голос
/ 12 октября 2014

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

enter image description here

Объектный адаптерзависит от состава объекта:

enter image description here

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

0 голосов
/ 13 октября 2018

https://www.journaldev.com/1487/adapter-design-pattern-java Шаблон проектирования адаптера - это один из шаблонов проектирования структуры, который используется для совместной работы двух не связанных между собой интерфейсов. Объект, который присоединяется к этим несвязанным интерфейсам, называется адаптером. - шаблон двустороннего адаптера При реализации шаблона Adapter существует два подхода - адаптер класса и адаптер объекта - однако оба эти подхода дают один и тот же результат.

Адаптер класса - Эта форма использует наследование Java и расширяет интерфейс источника, в нашем случае класс Socket. Object Adapter - эта форма использует Java Composition, а адаптер содержит исходный объект.

...