디자인패턴
[디자인패턴] 데코레이터 패턴(Decorator Pattern)
털쟁이개발자
2021. 7. 19. 17:32
정의
객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다.

특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다.
예시)
비행기 게임에서 전투기가 아이템을 먹을 때마다 기본공격 + 새로운 공격 => 아이템을 먹을때마다 공격이 더 화려해짐.
커피는 기본 에스프레소에서 재료를 더할 때마다 새로운 종류의 커피가 된다.
- 에스프레소 + 물 => 아메리카노
- 에스프레소 + 물 + 얼음 => 아이스 아메리카노
- 에스프레소 + 우유 => 라떼
- 에스프레소 + 우유 + 얼음 => 아이스 라떼
대충 이런식ㅎㅎ;
코드로 확인해보자!
Component : Fighter
ConcreteComponent : XWingFighter
Decorator : FighterDecorator
ConcreteDecorator : LaserDecorator, MissilDecorator, PlasmaDecorator
위의 UML 관계를 생각하며 보세요!
public interface Fighter {
public void attack();
}
public class XWingFight implements Fighter{
@Override
public void attack() {
System.out.println("탄환 발사");
}
}
public abstract class FighterDecorator implements Fighter {
private Fighter decoratordFighter;
public FighterDecorator(Fighter _decoratorFighter) {
decoratordFighter = _decoratorFighter;
}
@Override
public void attack() {
decoratordFighter.attack();
}
}
public class LaserDecorator extends FighterDecorator{
public LaserDecorator(Fighter _decoratorFighter) {
super(_decoratorFighter);
}
@Override
public void attack() {
super.attack();
System.out.println("레이져 발사");
}
}
public class MissilDecorator extends FighterDecorator{
public MissilDecorator(Fighter _decoratorFighter) {
super(_decoratorFighter);
}
@Override
public void attack() {
super.attack();
System.out.println("미사일 발사");
}
}
public class PlasmaDecorator extends FighterDecorator{
public PlasmaDecorator(Fighter _decoratorFighter) {
super(_decoratorFighter);
}
@Override
public void attack() {
super.attack();
System.out.println("플라즈마 발사");
}
}