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

특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다.
예시)
비행기 게임에서 전투기가 아이템을 먹을 때마다 기본공격 + 새로운 공격 => 아이템을 먹을때마다 공격이 더 화려해짐.
커피는 기본 에스프레소에서 재료를 더할 때마다 새로운 종류의 커피가 된다.
- 에스프레소 + 물 => 아메리카노
- 에스프레소 + 물 + 얼음 => 아이스 아메리카노
- 에스프레소 + 우유 => 라떼
- 에스프레소 + 우유 + 얼음 => 아이스 라떼
대충 이런식ㅎㅎ;
코드로 확인해보자!
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("플라즈마 발사");
}
}
'디자인패턴' 카테고리의 다른 글
[디자인 패턴] 옵져버 패턴(Observer Pattern) (0) | 2021.07.20 |
---|---|
[디자인패턴] 어댑터 패턴(Adaptor Parttern) (0) | 2021.07.20 |
[디자인패턴] 퍼사드 패턴(Facade Pattern) (0) | 2021.07.19 |
[디자인패턴] 템플릿메소드(Template Method Pattern) (0) | 2021.07.19 |
[디자인패턴] 전략 패턴(Strategy Pattern) (0) | 2021.07.15 |