Доброе утро. Шаг за шагом прохожу основные паттерны. Вот дошел черед и до адаптера. Везде где я читал, сказано, что адаптировать можно: 1. Классы 2. Абстрактные классы 3. Интерфейсы. Вопрос --- какой смысл адаптировать интерфейсы и абстрактные классы? Они же содержат только сигнатуры, без тел. И при вызове просто выбросит NullPointerException. Или я чего-то не понимаю? P. S. Прикрепляю внизу код, как пример адаптации интерфейсов. P. P. S. Знаю, что есть default методы. Но они скорее исключение, ведь не будут же создавать интерфейс ради default методов? Или будут?
// интерфейсы для адаптации
public interface DataBase {
    void update();
    void delete();
    void save();
    void load();
}


public interface JavaApp {
    void updateObject();
    void deleteObject();
    void saveObject();
    void loadObject();
}
// адаптер
public class JavaToDataBase implements JavaApp {
    private DataBase dataBase;

    @Override
    public void deleteObject() {
        dataBase.delete();
    }

    @Override
    public void saveObject() {
        dataBase.save();
    }

    @Override
    public void loadObject() {
        dataBase.load();
    }

    @Override
    public void updateObject() {
        dataBase.update();
    }
}
// тест
public class Main {
    public static void main(String[] args) {
       JavaToDataBase base = new JavaToDataBase();
       base.deleteObject();
       base.updateObject();
       base.loadObject();
       base.saveObject();
    }
}