Меню

Главная
Случайная статья
Настройки
Шаблон делегирования
Материал из https://ru.wikipedia.org

Делегирование (англ. Delegation) — основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects).

Содержание

Плюсы

Возможность изменить поведение конкретного экземпляра объекта вместо создания нового класса путём наследования.

Минусы

Этот шаблон обычно затрудняет оптимизацию по скорости в пользу улучшенной чистоты абстракции.

Применимость

Java

Хотя делегирование не поддерживается языком Java, его поддержка присутствует во многих средах разработки[1].

Примеры

Java

В этом примере на языке Java, класс B имеет метод-заглушку (method stub), который передаёт методы foo() и bar() классу A. Класс B делает вид, что он имеет атрибуты класса A.
class A {
    void foo() {
        System.out.println("A: вызван метод foo()");
    }
    void bar() {
        System.out.println("A: вызван метод bar()"); 
    }
}

class B {
    // Создаём объект, методам которого будет делегироваться поведение.
    A a = new A();

    void foo() {
        a.foo();
    }
    void bar() {
        a.bar();
    }
}

public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.foo();
        b.bar();
    }
}


Используя интерфейсы, делегирование можно осуществить более гибко и c защитой типов (typesafe). В этом примере, класс C может делегировать либо классу A либо классу B. Класс C имеет методы для переключения между классами A и B. Включение расширения implements улучшает безопасность типа, потому что каждый класс должен выполнять методы в интерфейсе. Основным недостатком является большее количество кода.

Приведем пример. Допустим, нужно реализовать таймер таким образом, чтобы через определённое количество времени вызывалась некоторая функция. Программист таймера хочет предоставить задание функции пользователям своего класса (другим программистам).
Downgrade Counter