Декоратор Java — это структурный паттерн, который используется при динамическом проектировании объекта. То есть при помощи этого паттерна можно к объекту «прикрутить» дополнительные свойства функциональности.
Объясним на примере их жизни. Допустим, у вас есть какой-то автомобиль. У него есть ограничение верхней скорости. Если вы захотите увеличить его максимум скорости, то первым делом вы можете провести тюнинг и заменить или усовершенствовать какие-то элементы:
заменить колеса на легкосплавные;
убрать все лишнее из салона;
расточить двигатель;
в крайнем случае поменять двигатель на более мощный.
То есть вы не бежите сразу в салон за новым автомобилем, хотя не исключено, что кто-то именно так и делает.
Декоратор Java дает возможность в динамическом режиме менять функциональность объекта, прямо в режиме его выполнения, применяя к нему классы паттерна. При этом не происходит никакого дополнительного влияния на другие объекты того же класса.
Декоратор Java
Паттерн декоратор Java применяется тогда, когда:
нужно изменить функциональность какого-то объекта в динамическом режиме, не трогая другие объекты;
нужно снять обязанности с какого-нибудь объекта;
невозможно или нецелесообразно использовать подклассы.
Паттерн декоратор Java на примере
Допустим, у нас есть некий интерфейс Bike:
public interface Bike {
public int getSpeed();
public int getHisWeight();
}
И в наличии будет стандартный мотоцикл с классом StandardBike:
public class StandardBike 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. Он на себя принимает класс StandardBike и прибавляет нашему стандартному мотоциклу скорость:
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();
}
}
Вот и получилось, что из обычного мотоцикла мы сделали полноценный спортбайк:
public class App {
public static void main(String[] args) {
Bike standardBike = new StandardBike();
System.out.println("Скорость стандартного мотоцикла - " + String.valueOf(standardBike.getSpeed()));
System.out.println("Стандартный мотоцикл может принимать вес" + String.valueOf(standardBike.getHisWeight()));
Bike sportBike = new SportBike(standardBike);
}

Другое