Предполагается, что шаблон декоратора будет подсвечен, чтобы добавить дополнительные функции к кораблям, поскольку базовая функция уже существует на базовом c корабле. Это SimpleShip
всегда идет с этими функциями.
Ваше видение шаблона декоратора в основном правильное, но когда вы украшаете корабль, вы должны сохранить основные функции, а также дополнительные. Это означает, что gotHit
должен делать то, что SimpleShip
делает + дополнительные вещи, которые GuardedShip
делает.
Итак, что это значит с точки зрения кода?
Вы должны назвать gotHit()
перед тем, как делать дополнительные вещи в украшенных кораблях:
class SneakyShip<T extends Weapon> extends ShipDecorator<T>{
public SneakyShip(SimpleShip<T> other, T weapon){
super(other);
}
@Override
private void gotHit(int reduction){
super.gotHit(reduction); // core behaviour of every ship
// additional feature of guarded ships
if(new Random().nextDouble() > 0.25){
// more damage
}
}
}
То, что вы делаете в своем коде, полностью меняет поведение корабля относительно поведения gotHit
.
Здесь это некоторые ссылки