김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GitHubDesktop
  • Remote저장소
  • ㄱ
  • KMU_WINK
  • 원격저장소
  • 로컬저장소
  • local저장소
  • 깃허브데스크탑

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴] 데코레이터 패턴(Decorator Pattern)
• 독서/Design Pattern

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

2022. 9. 27. 02:13

# 설명

  • 객체(오브젝트)에 동적으로 책임(기능)을 추가한다.
  • 뜻 그대로 피자의 토핑을 하나씩 올리는거와 같이 기능을 하나씩 추가해 나간다.
  • 상속을 사용하지 않고도 유연하게 기능의 확장이 가능하다. ( 특히 자바는 다중 상속을 지원하지 않는다 ). 
  • Component - 동적으로 추가할(될) 서비스를 가질 수 있는 객체 정의
  • ConcreteComponent - 추가적인 서비스가 필요한 실제 구현 객체
  • Decorator - Component의 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 정의
  • ConcreteDecorator - 새롭게 추가되는 서비스를 실제 구현할 클래스로 addBehavior()을 통해 구현.

 

## 간단 예제

라면을 정의한 라면 클래스를 상속받는 카레라면과 너구리라면을 통해서, 각각의 카레라면, 너구리라면의 실 구현객체를 만들 수 있다.

아뿔싸! 카레 라면과 너구리라면을 합친 카구리라면을 만들고 싶다. 근데 별 수 없이 카레라면과 너구리라면을 재활용하지 못하고 카구리라면을 만들어야 하는 위기에 봉착했다. 어떻게 카구리라면을 재활용해 만들 수 있을까?

카레와 너구리를 데코레이터를 이용해 concrete 데코레이터로 만들어 라면구현객체에 카레와 너구리를 합쳐줘 카구리라면을 만들면 보다 쉽게 만들 수 있을 것이다.

그러나 한눈에 보기에, 작은 규모의 객체들이 많이 생성 될 수 있다는 단점이 보이기도 한다.

 

## 코드 예제

조합을 동적으로 결정할 수 있다. 즉 케냐+밀크+모카+밀크+모카를 위한 별도의 클래스를 생성하지 않고, 데코레이터를 활용해 동적으로 만들 수 있다.

 

# 코드


## Component

// Coffee
public abstract class Coffee {
    public abstract void brewing();
}

## Concrete Component

기본 기능을 제공한다. ( 예제에서는 베이스가 되는 원두 )

// KeyaCoffee
public class KeyaCoffee extends Coffee{
    @Override
    public void brewing() {
        System.out.print("KeyaCoffee");
    }
}
// EtiopiaCoffee
public class EtiopiaCoffee extends Coffee{
    @Override
    public void brewing() {
        System.out.print("EtiopiaCoffee ");
    }
}

## Decorator

// Decorator
public abstract class Decorator extends Coffee {

    Coffee coffee;

    public Decorator(Coffee coffee){
        this.coffee = coffee;
    }

    @Override
    public void brewing() {
        coffee.brewing();
    }
}

## Concrete Decorator

super.brewing()을 호출해 상위의 기본기능을 수행하게하고 데코레이팅하는 기능을 추가한다. 

// Latte
public class Latte extends Decorator{
    public Latte(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brewing() {
        super.brewing();
        System.out.print(" +Adding Milk(Latte)");
    }
}
// MochaCoffee
public class MochaCoffee extends Decorator{
    public MochaCoffee(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brewing() {
        super.brewing();
        System.out.print(" +Ading Mocha Syrup");
    }
}

# 테스트

// Test
public class Test {
    public static void main(String[] args) {
        // Coffee etiopiaCoffee = new EtiopiaCoffee();

        Coffee keyaCoffee = new KeyaCoffee();
        keyaCoffee.brewing();
        System.out.println();

        Coffee keyaLatte = new Latte(keyaCoffee);
        keyaLatte.brewing();
        System.out.println();

        Coffee keyaLatteMocha = new MochaCoffee(keyaLatte);
        keyaLatteMocha.brewing();
        System.out.println();

        Coffee keyaMochaLatte = new Latte(new MochaCoffee(new KeyaCoffee()));
        keyaMochaLatte.brewing();
    }
}

## 결과

 

# 참고

 

[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

저작자표시 (새창열림)

'• 독서 > Design Pattern' 카테고리의 다른 글

[디자인패턴] 어댑터 패턴(Adapter Pattern)  (0) 2022.10.01
[디자인 패턴] 컴포지트 패턴(Composite Pattern)  (0) 2022.09.30
[디자인패턴] 브릿지 패턴(Bridge Pattern)  (0) 2022.09.22
[디자인패턴] 전략패턴 (Strategy Pattern)  (1) 2022.09.21
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)  (2) 2022.09.20
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [디자인패턴] 어댑터 패턴(Adapter Pattern)
    • [디자인 패턴] 컴포지트 패턴(Composite Pattern)
    • [디자인패턴] 브릿지 패턴(Bridge Pattern)
    • [디자인패턴] 전략패턴 (Strategy Pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바