Паттерн делегирования (Delegation) в Java

Паттерн делегирования (Delegation) является поведенческим (behavioral) паттерном проектрования.

Это техника, в которой объект выражает определенное поведение снаружи, но в реальности делегирует ответственность за реализацию этого поведения связанному объекту.

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

Используйте шаблон делегата для достижения следующего:

  • Уменьшение связанности методов с их классом
  • Работы компонентов, которые ведут себя одинаково, но предполагается, что эта ситуация может измениться в будущем.

Пример использования паттерна делегирования на Java

Предположим у нас есть автомобиль - интерфейс Car, имеющий метод ride:

package example;

public interface Car {
    public void ride(String name);
}

Класс CarController реализует интерфейс Car, но сам действие не выполняет, а делегирует это вспомогательному классу, экземпляр которого хранит в своем поле car:

package example;

public class CarController implements Car {

    private final Car car;

    public CarController(Car car) { this.car = car; }

    @Override
    public void ride(String name) {
        car.ride(name);
    };
}

Есть вспомогательные классы которые непосредственно выполняют действие - BMWCar, MercedesCar, VolvoCar - они также реализуют интерфейс Car, но в самом приложении вызываются опосредованно через экземпляр класса CarController, который делегирует им выполнение работы:

package example.cars;

import example.Car;

public class BMWCar implements Car {
    @Override
    public void ride(String name) {
       System.out.println(name + " rides in BMW");
    };
}

package example.cars;

import example.Car;

public class MercedesCar implements Car {
    @Override
    public void ride(String name) {
        System.out.println(name + " rides in Mercedes");
    };
}

package example.cars;

import example.Car;

public class VolvoCar implements Car {
    @Override
    public void ride(String name) {
        System.out.println(name + " rides in Volvo");
    };
}

В самом приложении экземпляры вспомогательных классов передаются в CarController и вызов на выполнение действия осуществляется на экземпляре класса CarController:

package example;

import example.cars.*;

public class App {

    private static final String RIDER = "Tom";

    public static void main(String[] args) {
        CarController bmw = new CarController(new BMWCar());
        CarController mercedes = new CarController(new MercedesCar());
        CarController volvo = new CarController(new VolvoCar());

        bmw.ride(RIDER);
        mercedes.ride(RIDER);
        volvo.ride(RIDER);
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки