본문 바로가기

디자인패턴

[디자인패턴] 데코레이터 패턴(Decorator Pattern)

정의

객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다.

Decorator pattern UML

 

특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다.

 

예시)

비행기 게임에서 전투기가 아이템을 먹을 때마다 기본공격 + 새로운 공격 => 아이템을 먹을때마다 공격이 더 화려해짐.

커피는 기본 에스프레소에서 재료를 더할 때마다 새로운 종류의 커피가 된다. 

  • 에스프레소 + 물 => 아메리카노
  • 에스프레소 + 물 + 얼음 => 아이스 아메리카노
  • 에스프레소 + 우유 => 라떼
  • 에스프레소 + 우유 + 얼음 => 아이스 라떼

대충 이런식ㅎㅎ;

 

코드로 확인해보자!

 

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("플라즈마 발사");
    }
}