Паттерн делегирования (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);
}
}
Читайте также:
- Паттерн Наблюдатель (Observer) в Java
- Паттерн Адаптер (Adapter) в Java
- Паттерн Декоратор (Decorator) в Java
- Паттерн Builder (Строитель) в Java
Комментарии
Отправить комментарий