Декоратор Java — это структурный паттерн, который используется при динамическом
проектировании объекта. То есть, при помощи этого паттерна можно к объекту
«прикрутить» дополнительные свойства функциональности.
Объясним на примере их жизни. Допустим у вас есть какой-то автомобиль. У него
есть ограничение верхней скорости. Если вы захотите увеличить его максимум
скорости, то первым делом вы можете провести тюнинг и заменить или
усовершенствовать какие-то элементы:
- заменить колеса на легкосплавные;
- убрать все лишние из салона;
- расточить двигатель;
- в крайнем случае поменять двигатель на более мощный.
То есть, вы не бежите сразу в салон за новым автомобилем, хотя не исключено, что
кто-то именно так и делает.
То есть декоратор Java, дает возможность в динамическом режиме менять
функциональность объекта, прямо в режиме его выполнения, применяя к нему
классы паттерна. При этом не происходит никакого дополнительного влияния на
другие объекты того же класса.
Декоратор Java
Паттерн декоратор Java применяется тогда, когда:
- нужно изменить функциональность какого-то объекта в динамическом режиме, не трогая другие объекты;
- нужно снять обязанности с какого-нибудь объекта;
- невозможно или не целесообразно использовать подклассы.
Паттерн на примере
Допустим у нас есть некий интерфейс Bike:
public interface Bike {
public int getSpeed();
public int getHisWeight();
}
И в наличии будет стандартный мотоцикл с классом StandartBike:
public class StandartBike implements Bike {
private int speed = 40;
private int HisWeight = 90;
@Override
public int getSpeed() {
return this.speed;
}
@Override
public int getHisWeight() {
return this.HisWeight;
}
}
Если вдруг мы захотим из нашего простого мотоцикла сделать полноценный
гоночный спортбайк, то для этого у нас есть в декораторе класс SportBike. Он на себя
принимает класс StandartBike и прибавляет нашему стандартному мотоциклу
скорость:
public class SportBike implements Bike {
private Bike bike;
public SportBike(Bike bike){
this.bike = bike;
}
@Override
public int getSpeed() {
return this.bike.getSpeed() + 60;
}
@Override
public int getHisWeight() {
return this.bike.getHisWeight();
}
}
Возможно вам будет интересно почитать статью “Data Scientist: кто это и что он должен знать?”
Вот и получилось, что из обычного мотоцикла, мы сделали полноценный спортбайк:
public class App {
public static void main(String[] args) {
Bike standartBike = new StandartBike();
System.out.println(“Скорость стандартного мотоцикла – ” +
String.valueOf(standartBike.getSpeed()));
System.out.println(“Стандартный мотоцикл может принимать вес” +
String.valueOf(standartBike.getHisWeight()));
Bike sportBike = new SportBike(standartBike);
}