Decorator 패턴

seringee·2023년 11월 26일
0

개발자개인공부

목록 보기
22/28

Decorator pattern

  • 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴
  • 클래스의 요소들을 계속 수정하면서 사용하는 구조가 필요한 경우
  • 여러 요소들을 조합해서 사용하는 클래스 구조인 경우

1

  • component와 ConcreteDecorator를 동일히 하도록 해주는 역할

장단점

장점

  • 기존 코드를 수정하지 않고 데코레이터 패턴을 통해 행동 확장 가능
  • 구성과 위임을 통해 실행 중 새로운 행동 추가 가능

단점

  • 의미없는 객체들이 많이 추가 될 수 있음
  • 코드가 복잡해질 수 있음

예제

Component.interface

public interface Component {
    String add(); //재료 추가
}

BaseComponent.java

public class BaseComponent implements Component {

    @Override
    public String add() {
        // TODO Auto-generated method stub
        return "에스프레소";
    }
}

Decorator.java

abstract public class Decorator implements Component {
    private Component coffeeComponent;
    
    public Decorator(Component coffeeComponent) {
        this.coffeeComponent = coffeeComponent;
    }
    
    public String add() {
        return coffeeComponent.add();
    }
}

WaterDecorator.java

//물을 추가해주는 클래스
public class WaterDecorator extends Decorator {
    public WaterDecorator(Component coffeeComponent) {
        super(coffeeComponent);
    }
    
    @Override
    public String add() {
        // TODO Auto-generated method stub
        return super.add() + " + 물";
    }
}

MilkDecorator.java

//우유를 추가해주는 클래스
public class MilkDecorator extends Decorator {
    public MilkDecorator(Component coffeeComponent) {
        super(coffeeComponent);
    }
    
    @Override
    public String add() {
        // TODO Auto-generated method stub
        return super.add() + " + 우유";
    }
}

Main.java

public class Main {

    public static void main(String[] args) {
        Component espresso = new BaseComponent();
        System.out.println("에스프레소 : " + espresso.add());
        
        Component americano = new WaterDecorator(new BaseComponent());
        System.out.println("아메리카노 : " + americano.add());
        
        Component latte = new MilkDecorator(new WaterDecorator(new BaseComponent()));
        System.out.println("라떼 : " + latte.add());
    }
}

// 결과
// 에스프레소 : 에스프레소
// 아메리카노 : 에스프레소 + 물
// 라떼 : 에스프레소 + 물 + 우유
profile
개발 공부 정리하고 저장하기

0개의 댓글